javascript - Electron webContents执行JavaScript : Cannot execute script on second on loadURL

标签 javascript node.js electron

我正在测试 Electron,特别是使用executeJavaScript。我的项目使用 POST 请求登录网站,然后执行一些工作并使用同一 session 加载第二个 URL。在第二个 URL 中,我需要执行 JS,但我不确定我做错了什么。

在这个例子中,我创建了一个简化版本,模拟访问两个 URL 并在第二个 URL 上执行 JS。对这里发生的事情有什么想法吗?

const {app, BrowserWindow} = require('electron');

let win;

function createWindow() {

  win = new BrowserWindow({width: 1000, height: 600})
  win.openDevTools();

  // First URL
  win.loadURL('https://www.google.com')

  // Once dom-ready
  win.webContents.once('dom-ready', () => {

    // THIS WORKS!!!
    win.webContents.executeJavaScript(`
      console.log("This loads no problem!");
    `)

    // Second URL
    win.loadURL('https://github.com/electron/electron');

    // Once did-navigate seems to function fine
    win.webContents.once('did-navigate', () => {

      // THIS WORKS!!! So did-navigate is working!
      console.log("Main view logs this no problem....");

      // NOT WORKING!!! Why?
      win.webContents.executeJavaScript(`

        console.log("I canot see this nor the affects of the code below...");

        const form = document.querySelectorAll('form.js-site-search-form')[0];

        const input = form.querySelectorAll('input.header-search-input')[0]

        input.value = 'docs';

        form.submit();

      `)

    })
  })
}

app.on('ready', createWindow );

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

最佳答案

这是因为您尝试在 dom-ready 事件之前运行 Javascript。

尝试在此事件完成后执行您的 JavaScript,如下所示

const { app, BrowserWindow } = require('electron');

let win;

function createWindow() {

    win = new BrowserWindow({ width: 1000, height: 600 })
    win.openDevTools();

    // First URL
    win.loadURL('https://www.google.com')

    // Once dom-ready
    win.webContents.once('dom-ready', () => {

        // THIS WORKS!!!
        win.webContents.executeJavaScript(`
      console.log("This loads no problem!");
    `)

        // Second URL
        win.loadURL('https://github.com/electron/electron');

        // Once did-navigate seems to function fine
        win.webContents.once('did-navigate', () => {

            // THIS WORKS!!! So did-navigate is working!
            console.log("Main view logs this no problem....");
            win.webContents.once('dom-ready', () => {
                // NOT WORKING!!! Why?
                win.webContents.executeJavaScript(`

        console.log("I canot see this nor the affects of the code below...");

        const form = document.querySelectorAll('input.js-site-search-form')[0];

        const input = form.querySelectorAll('input.header-search-input')[0]

        input.value = 'docs';

        form.submit();

      `)

            })
        });
    })
    }

    app.on('ready', createWindow);

    app.on('window-all-closed', () => {
        if (process.platform !== 'darwin') {
            app.quit();
        }
    });

关于javascript - Electron webContents执行JavaScript : Cannot execute script on second on loadURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43554536/

相关文章:

php - 如何在网站上画矩形突出显示?

node.js - 如何在 Redis 中的对象中搜索值?

node.js - 引用错误 : require is not defined (on my rest api)

xamarin.forms - 是否可以使用 xamarin.forms 构建桌面跨平台应用程序(与 Electron 相同)?

javascript - 将更多弹出窗口绑定(bind)到同一标记或合并弹出窗口内容

javascript - 如何检测调用 jquery 脚本的内容

database - 环回: Cannot find module 'negotiator'

Electron:ipcMain.on 和 ipcMain.handle 可以使用相同的 channel 名称吗?

electron - 如何恢复 Electron 应用程序中的默认窗口大小?

javascript - 单击全屏 - Ext JS