浏览器控制网页上传文件方法(MV3版本)

动作开发 · 1097 次浏览
涛涛涛 创建于 2天4小时前

//文件上传函数
   async function 文件上传(e) {
        let {target: t, selector: r, files: o} = e
          , n = await Pe(t)
          , a = !1;
        try {
            a = (await chrome.debugger.getTargets()).some(u => u.tabId === n.tabId && u.attached),
            a || await chrome.debugger.attach(n, "1.3");
            let l = await chrome.debugger.sendCommand(n, "DOM.getDocument", {});
            l = await chrome.debugger.sendCommand(n,"DOM.querySelector", {"nodeId": l.root.nodeId,"selector":r});
            l = await chrome.debugger.sendCommand(n, "DOM.setFileInputFiles", {"nodeId":l.nodeId,"files":o});
            return a || await chrome.debugger.detach(n),l
        } catch (s) {
            if (!a)
                try {
                    await chrome.debugger.detach(n)
                } catch (l) {
                    console.error("\u5206\u79BB\u8C03\u8BD5\u5668\u65F6\u51FA\u9519:", l)
                }
            throw s
        }
    }

//参数说明
target: 调试目标
selector: 文件框css选择器
files: 需要上传文件的路径数组


//参数示例
{
  "target": {"tabId": 123},
  "selector": "#fileInput",
  "files":["C:/Users/Administrator/Desktop/js脚本.txt"]
}

该方法可以通过控制浏览器上传文件,把浏览器插件下载到本地,然后改用一下调用此函数,再用浏览器加载浏览器插件,调用可以成功运行此函数.

但通过浏览器插件商店下载的插件测试时,运行到此await chrome.debugger.sendCommand(n, "DOM.setFileInputFiles", {"nodeId":l.nodeId,"files":o});会报错,不知是否可以有方法解决


回复内容
CL 2天4小时前
#1

你这个是从哪里查的呢? 我查的结论是没法上传指定文件的,浏览器有安全限制。

涛涛涛 回复 CL 2天4小时前 :

是通过其他浏览器自动化插件文件上传的方法改了一下,本地测试可以上传成功

CL 回复 涛涛涛 2天4小时前 :

啥报错?啥插件改的,怎么改的?本地是咋测试的?

涛涛涛 回复 CL 2天4小时前 :

测试方法:

将浏览器插件下载到本地,将插件中quickerconnector_1.0.1\background\background.js中的函数改成此函数。

例如,将background.js文件中的function Bo()函数改成此函数(即: api_bookmarks_getTree 获取书签树 调用的方法),就这样测试的

涛涛涛 回复 CL 2天4小时前 :

https://getquicker.net/subprogram?id=f2b6aea4-ebcd-4bc2-5ebc-08dd8e05eba5

这是一个子程序,可以测试一下看看

涛涛涛 回复 CL 2天4小时前 :

{"code":-32000,"message":"Not allowed"}{}这个是报错信息

涛涛涛 回复 CL 2天3小时前 :

通过浏览器插件商店下载的插件,可以使用了,需要插件把允许访问文件URL打勾

CL 回复 涛涛涛 2天0小时前 :

好的,感谢分享。

涛涛涛 回复 CL 2天0小时前 :

还有如果需要同时上传多份文件,文件框同时也允许,只需要在,例如:"files":["C:/Users/Administrator/Desktop/22.png","C:/Users/Administrator/Desktop/11.png"]数组中添加路径就可以了

CL 回复 涛涛涛 2天0小时前 :

效果不错,我等直接添加到后台命令里试试。 还有什么比较有用的功能嘛?

涛涛涛 回复 CL 2天0小时前 :

好的,其他的没有了,其他的都是工作方面针对性的功能,不具有普遍性

乐昂岚【接定制】 回复 CL 1天22小时前 :

老大看看这个可以作为命令吗https://getquicker.net/QA/Question/33255

涛涛涛 回复 乐昂岚【接定制】 1天21小时前 :

你的那个问题,好像不要那么麻烦,只需要把返回值转成字符串类型,在改一下执行环境为MAIN就行了,这样试试

乐昂岚【接定制】 回复 涛涛涛 1天20小时前 :

并不行依旧报错

涛涛涛 回复 乐昂岚【接定制】 1天20小时前 :

你先测试那个网页var data = window.__INITIAL_STATE__.datalist.zhuanlilist.data[0];这个变量是否存在,我测试没有找到这个变量的的存在,不知道是网址好像不对还是未登陆的原因,还有就是你测试的时候把其他无关的先都删除,以免影响

乐昂岚【接定制】 回复 涛涛涛 1天20小时前 :

我这测试存在, 换无痕模式也一样, 未登录也是存在的

目前就是手动在控制台运行可以正常获取数据, 如果通过quicker运行就报错

CL 回复 乐昂岚【接定制】 1天18小时前 :

执行环境选MAIN应该就可以了。

涛涛涛 回复 乐昂岚【接定制】 1天18小时前 :

已测试完毕,上面的方式是可以的,你把你测试的过程截图发一下看看

涛涛涛 回复 涛涛涛 1天18小时前 :


涛涛涛 最后更新于 1天18小时前
涛涛涛 回复 乐昂岚【接定制】 1天18小时前 :

还有一个需要注意的一点就是运行 quicker浏览器插件动作时,需要先关闭浏览器控制台,不然运行也会报错,报超时

乐昂岚【接定制】 回复 涛涛涛 1天17小时前 :

ok了多谢

回复主贴