浏览器控制网页上传文件可跨框架(iframe)上传的方法和原理(方法可能不唯一)

动作开发 · 895 次浏览
涛涛涛 创建于 1天17小时前

该方式是实现的方法,在本地可以初步实现,与quicker之间的数据关联互通,待研究优化

该方法是通过模拟js点击文件框(并不非要是文件框CSS选择器,只要是可以通过点击唤起文件框上传框的网页元素应该都可以),让事件监听器自己寻找文件框的backendNodeId数据,进而再调用DOM.setFileInputFiles的方法上传文件

function 上传文件函数2(tabId){

chrome.debugger.attach({ tabId: tabId }, '1.3');
chrome.debugger.sendCommand({ tabId: tabId }, 'Page.enable');
chrome.debugger.sendCommand({ tabId: tabId }, 'Page.setInterceptFileChooserDialog', { enabled: true });

chrome.debugger.onEvent.addListener((source, method, params) => {
  if (method === 'Page.fileChooserOpened') {
    chrome.debugger.sendCommand({ tabId: tabId }, "DOM.setFileInputFiles", {"backendNodeId":params.backendNodeId,"files":["C:/Users/Administrator/Desktop/11.png"]});
    console.log(params);}
    chrome.debugger.sendCommand({ tabId: tabId }, 'Page.setInterceptFileChooserDialog', { enabled: false });
});}

以下是ai解释说明:

这个函数 上传文件函数2 是一个 Chrome 扩展的函数,用于与 Chrome 的调试器(Debugger)进行交互,具体来说,它是用来处理文件选择对话框的。下面是对这个函数的详细解释:

函数定义


function 上传文件函数2(tabId) {
  // ... 函数体
}
这个函数接受一个参数 tabId,表示要操作的标签页的 ID。

1. 附加调试器


chrome.debugger.attach({ tabId: tabId }, '1.3');
这一行代码将调试器附加到指定的标签页。chrome.debugger.attach 方法用于将调试器附加到目标(在这里是标签页)。参数是一个对象,包含 tabId 和调试器协议的版本号(这里是 ‘1.3’)。

2. 启用页面事件


chrome.debugger.sendCommand({ tabId: tabId }, 'Page.enable');
这一行代码发送一个命令到调试器,启用页面事件。chrome.debugger.sendCommand 方法用于向调试器发送命令。参数是一个对象,包含 tabId 和要发送的命令(这里是 ‘Page.enable’)。

3. 设置文件选择对话框的拦截


chrome.debugger.sendCommand({ tabId: tabId }, 'Page.setInterceptFileChooserDialog', { enabled: true });
这一行代码发送一个命令到调试器,设置文件选择对话框的拦截。参数是一个对象,包含 tabId 和要发送的命令(这里是 ‘Page.setInterceptFileChooserDialog’),以及一个配置对象,包含 enabled 属性,设置为 true 以启用拦截。

4. 添加事件监听器


chrome.debugger.onEvent.addListener((source, method, params) => {
  if (method === 'Page.fileChooserOpened') {
    chrome.debugger.sendCommand({ tabId: tabId }, "DOM.setFileInputFiles", {"backendNodeId": params.backendNodeId, "files": ["C:/Users/Administrator/Desktop/11.png"]});
    console.log(params);
  }
  chrome.debugger.sendCommand({ tabId: tabId }, 'Page.setInterceptFileChooserDialog', { enabled: false });
});
这一行代码添加一个事件监听器,用于监听调试器事件。chrome.debugger.onEvent.addListener 方法用于添加事件监听器。回调函数接受三个参数:source(事件源)、method(事件方法)和 params(事件参数)。

在回调函数中,检查事件方法是否为 'Page.fileChooserOpened',如果是,则发送一个命令到调试器,设置文件输入框的文件。参数是一个对象,包含 tabId 和要发送的命令(这里是 ‘DOM.setFileInputFiles’),以及一个配置对象,包含 backendNodeId 和要设置的文件路径。

5. 关闭文件选择对话框的拦截


chrome.debugger.sendCommand({ tabId: tabId }, 'Page.setInterceptFileChooserDialog', { enabled: false });
这一行代码发送一个命令到调试器,关闭文件选择对话框的拦截。参数是一个对象,包含 tabId 和要发送的命令(这里是 ‘Page.setInterceptFileChooserDialog’),以及一个配置对象,包含 enabled 属性,设置为 false 以关闭拦截。

总结
这个函数的主要作用是:

将调试器附加到指定的标签页。
1.启用页面事件。
2.设置文件选择对话框的拦截。
3.监听文件选择对话框打开事件,并在事件触发时自动设置文件输入框的文件。
4.关闭文件选择对话框的拦截。
通过这种方式,可以实现自动选择文件的功能,而不需要用户手动操作文件选择对话框。


回复内容
暂无回复
回复主贴