【问题标题】:Can't launch selenium drivers while in Electron renderer process在 Electron 渲染器进程中无法启动 selenium 驱动程序
【发布时间】:2022-01-05 06:54:45
【问题描述】:

几个月前,我构建了一个电子应用程序,它使用 selenium 从网页中抓取数据,然后在电子网页中将其可视化,一切正常。 几个月不使用它后,我遇到了麻烦,因为电子和硒本身内部发生了许多重大变化。 主要的重大变化是无法再从渲染器进程启动 selenium webdrivers,但我只能在主进程中启动它。

下面是我正在尝试做的一个最小的非工作示例:

// index.js - entry point of the program

const electron = require("electron");
let app = electron.app
let mainWin;

app.on('ready', () => {
        mainWin = new electron.BrowserWindow({
                width: 100,
                height: 100,
                frame: true,
                backgroundColor: '#222222',
                webPreferences: {
                        nodeIntegration: true,
                        contextIsolation: false
                },
        });
        mainWin.loadFile('./home.html');
        mainWin.on('closed', function () {
                console.log('byebye')
        });
});
// home.html
<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
</head>
<body>
        hello 
</body>
<script type="text/javascript">require('./home.js')</script>
</html>
//home.js - script file for the home.html launched in the main process

const { Builder, By } = require('selenium-webdriver');
process.env.PATH += `${__dirname};`;

(async () => {
        let driver = await new Builder().forBrowser('chrome').build();
        await driver.get('https://www.google.com');
        let test = await driver.findElements(By.css('div'))
        console.log(test) 
})()

程序完全停留在 chrome webdrivers 的构建上。 我 100% 确定我使用的是正确的 chromedriver 版本,我从来没有收到错误或有用的东西,只是空的,没完没了地运行。

我是否遗漏了某些东西(例如窗口的 webpreferences 标志)或者这是电子/硒的错误?

似乎只有当我在 Linux 上使用它时才会发生这种情况。

重建程序以从主进程启动驱动程序意味着从头开始重建程序,因为它使用不同的窗口等等,我无法使用 IRC 将驱动程序或其他任何东西从主进程传递给渲染器因为它破坏了驱动程序对象本身。

【问题讨论】:

  • 所以 tl;dr 除了 Linux 之外的任何地方都可以使用,对吧?几乎可以要求此架构中的所有内容生成一些非常广泛的日志(文件)。我会从搜索这些线索开始。
  • @RandyCasburn 抱歉,但我无法在构建驱动程序时找到从 selenium 获取日志的方法,但只能在构建驱动程序之后获得其他信息,你知道吗有吗?
  • @RandyCasburn 不幸的是,即使将每种类型的日志记录启用到更高级别,也没有任何信息显示在任何地方。可能是因为它们仍然是一个实验性功能(第一个链接)或 selenium 的第一个版本(第二个链接)的遗留功能。我的猜测是,这些日志记录功能期望驱动程序完全构建并工作以完成它们的工作,因为这些是传递给驱动程序构建器的参数。还有就是忽略了CLIENT级别的日志,所以没办法获取这些日志,正是我需要的

标签: javascript selenium electron


【解决方案1】:

好的,我也设法让它在 Linux 上运行。调整是使用一个预加载脚本来初始化驱动程序实例,然后通过污染窗口对象将其传递给渲染器进程(这是推荐的方式,如下所示https://www.electronjs.org/docs/latest/tutorial/security#how-1)。这样就可以在Linux中用selenium和electron在renderer进程中获得一个完全工作的驱动实例了。

以下是使其工作的更改:

// index.js - entry point of the program

const electron = require("electron");
let app = electron.app
let mainWin;

app.on('ready', () => {
        mainWin = new electron.BrowserWindow({
                width: 100,
                height: 100,
                frame: true,
                backgroundColor: '#222222',
                webPreferences: {
                        nodeIntegration: true,
                        contextIsolation: false
                        preload: path.join(__dirname,'preload.js')
                },
        });
        mainWin.loadFile('./home.html');
        mainWin.on('closed', function () {
                console.log('byebye')
        });
});
//preload.js
const { Builder, By } = require('selenium-webdriver');
(async () => {
        let driver = await new Builder().forBrowser('chrome').build();
        window.pollutingDriver = driver
})()

//home.js
//retrieve the driver in this way

const sleep = (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms))
}
var driver = null ;
(async () => {
        while(!driver) {
            driver = window.pollutingDriver
            await sleep(500)
        }
        //do the main work on the page
})()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2017-07-09
    • 2021-07-01
    • 2018-04-02
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多