从Electron BrowserView中提取输入字段填充的数据

mm9b1k5b  于 2023-09-28  发布在  Electron
关注(0)|答案(1)|浏览(150)

例如,下面是一个简单的BrowserWindow,它具有适当的安全设置,但webviewTag: true是本项目所必需的。

let webPrefs = {
    plugins: false,
    nodeIntegration: false,
    nodeIntegrationInWorker: false,
    webviewTag: true,
    sandbox: true,
    enableRemoteModule: false,
    contextIsolation: true,
    disableBlinkFeatures: "Auxclick",
    webSecurity: true
};

let winOpts = {
    ...
    show: true,
    webPreferences: webPrefs
};

...

win = new BrowserWindow(winOpts);
const view = new BrowserView(winOpts);
win.setBrowserView(view);

...

view.webContents.loadURL("https://example.com").then(result => {
....
});

假设example.com网站包含<form>和几个<input>字段。
用户将在这些<input>字段中键入文本。
我想从这些<input>字段中提取“手动填充”的文本。该网页不是我的,因此不能修改网站。
webContents.executeJavaScript()可以作为一个起点,但无法找到如何将值本身“提取”到main进程中。
(主进程中的表单填写可以通过上面的功能完成。)
我如何才能做到这一点?

44u64gxh

44u64gxh1#

在main中,像这样从electron导入ipcMain

const { ipcMain, app, BrowserWindow,BrowserView } = require("electron");

webPrefs中添加预加载文件。例如

let webPrefs = {
    plugins: false,
    nodeIntegration: false,
    nodeIntegrationInWorker: false,
    webviewTag: true,
    sandbox: true,
    enableRemoteModule: false,
    contextIsolation: true,
    disableBlinkFeatures: "Auxclick",
    webSecurity: true,
    preload:"./preload.js"
};

创建一个新的preload文件并命名为“preload.js”。当然,你可以命名它,只要确保在上面的preload中设置了正确的文件名。
这个文件就像一个桥梁之间的webview和主进程。预加载脚本在渲染器进程被加载之前运行,并且可以访问渲染器全局变量(例如窗口和文档)和Node.js环境。
将以下代码放入preload.js文件中

const { ipcRenderer } = require("electron");

window.addEventListener("input", (e) => {
  //dom_element_id = the id of input element you want
  if (e.target.id === "dom_element_id")
    ipcRenderer.invoke("INPUT_OCCURED", e.target.value);
});

现在回到你的主文件,例如你可以添加

win.loadURL("https://www.example.com");

  ipcMain.handle("INPUT_OCCURED", (event, data) => {
    console.log(data);
  });

你需要的所有代码。现在再做一些解释。
preload文件在webview内容之前被加载,并且可以运行任何你想要的东西。它也可以访问节点的东西。我们所做的是使用IPC在preload和main之间进行通信。我们在preload中添加了一个全局监听器,它列出了所有输入事件。然后他检查并且如果ID与dom_element_id匹配,则其将DOM元素值发送到main。主获取事件数据在INPUT_OCCURED他上市
我之所以添加一个全局侦听器而不是获取元素并将侦听器添加到他,只是为了简化示例。

相关问题