从 Electron 的主进程访问已加载页面的 DOM

问题描述 投票:0回答:1

我知道访问 HTML 文档的最佳方法是从渲染器进程中,我应该使用一系列 ipcMain/ipcRenderer 调用从主进程中执行此操作。然而,在这种情况下,我必须从主要部分完成这一切,所以我用

.executeJavascript()

来做这件事

我得到的错误

UnhandledPromiseRejectionWarning: Error: Script failed to execute, this normally means an error was thrown. Check the renderer console for the error.
[1]     at WebFrame.e.startsWith.e.startsWith.WebFrame.<computed> [as _executeJavaScript] (electron/js2c/sandbox_bundle.js:67:1601)
[1]     at electron/js2c/sandbox_bundle.js:91:463
[1]     at electron/js2c/sandbox_bundle.js:75:390
[1]     at EventEmitter.<anonymous> (electron/js2c/sandbox_bundle.js:79:757)
[1]     at EventEmitter.emit (electron/js2c/sandbox_bundle.js:146:3752)
[1]     at Object.onMessage (electron/js2c/sandbox_bundle.js:127:1253)

我尝试过的

[1]

this.webContents.executeJavaScript(`
      require('electron').ipcRenderer.send('acquired-page-dom', String(document.body.innerHTML));
    `);
      ipcMain.once('acquired-page-dom', (ev, html) => {
        console.log('~#~#~')
        console.log(3)
        e.sender.send('got-page-dom', html)
      })

没成功。所以我在第二次尝试中尝试将文档作为字符串传递,因为我听说发送的对象必须是可序列化的

[2]

this.webContents.executeJavaScript(`
      var html = String(document.body.innerHTML);
      require('electron').ipcRenderer.send('acquired-page-dom', document.body.innerHTML);
    `)
      ipcMain.once('acquired-page-dom', (ev, html) => {
        console.log('~#~#~')
        console.log(3)
        e.sender.send('got-page-dom', html)
      })

它给出了同样的错误。

结论

这实际上与

.executeJavascript
函数中的 ipcRenderer 位无关。即使我传递像
.executeJavascript(`alert('hello')`);
这样的简单函数,我仍然会遇到相同的错误。 devTool 没有向该错误消息添加任何内容,所以我真的不知道如何进一步调试它,我陷入了困境。

我收到错误的上下文

仅当我的查看器中加载了网页时,我才会收到此错误。 如果我在我的主页(相当轻)上,我不会收到此错误。

附注 NodeIntegration 也设置为 True:

this.browserView = new BrowserView({
      webPreferences: {
        preload: `${app.getAppPath()}/build/view-preload.bundle.js`,
        nodeIntegration: false,
        contextIsolation: true,
        sandbox: true,
        enableRemoteModule: false,
        partition: incognito ? 'view_incognito' : 'persist:view',
        plugins: true,
        nativeWindowOpen: true,
        webSecurity: true,
        javascript: true,
      },
    });
javascript electron
1个回答
0
投票

以上问题你找到解决办法了吗?

© www.soinside.com 2019 - 2024. All rights reserved.