gpt4 book ai didi

javascript - Selenium Webdriver在Electron build中不起作用

转载 作者:行者123 更新时间:2023-12-03 12:21:51 27 4
gpt4 key购买 nike

我有一个 Electron 项目,该项目用一个按钮呈现html页面,单击该按钮时会调用 Node js脚本(通过IPC),该脚本使用 Selenium 来抓取网页。

这是我的项目结构:


-app/
--index.html
--main.js
--index.js
-package.json


这是我的package.json:
    {
"name": "agencies-scraper",
"version": "1.0.0",
"main": "app/main.js",
"devDependencies": {
"electron": "^5.0.7",
"electron-builder": "^21.1.1"
},
"scripts": {
"start": "electron .",
"pack": "electron-builder --dir",
"dist": "electron-builder",
"postinstall": "electron-builder install-app-deps"
},
"build": {
"appId": "my.id",
"files": [
"app/**/*",
"node_modules/**/*",
"package.json"
],
"mac": {
"category": "your.app.category.type"
},
},
"dependencies": {
"csv-writer": "^1.5.0",
"selenium-webdriver": "^4.0.0-alpha.4"
}
}


在index.html中,我有一个按钮:

<button id="test">Click to Scrape</button>


单击后,将引发以下 react 链:
  • 链接的index.js,向“反向 channel ” ipc channel 发送信号:

  • const {ipcRenderer} = require("electron");
    const button = document.getElementById("test");
    button.addEventListener("click", () => {
    ipcRenderer.send("backchannel");
    }

  • 在main.js中,我收听“backchannel”,并在触发后实例化一个 Selenium Web驱动程序,并在单独的Chrome浏览器中打开google.com:
  • const {app, BrowserWindow, ipcMain} = require('electron')
    const webdriver = require('selenium-webdriver')

    ipcMain.on('backchannel', async (event, arg) => {
    const driver = new webdriver.Builder()
    .forBrowser('chrome')
    .build()
    try {
    await driver.get('https://google.com');
    } catch (error) {
    console.log(error)
    }
    })
  • 操作系统询问我是否要 Electron 应用程序接受传入的连接,然后单击“允许”(无论如何, Selenium 都会打开浏览器):

  • 当我通过 npm start进行开发时,此方法非常有效。

    但是,当我通过 npm run-script packnpm run-script dist打包应用程序时,构建版本无法达到步骤3。不会弹出权限窗口,也不会打开浏览器。 Selenium 在那里不起作用。

    我确信IPC在构建版本中正在从index.js到main.js,所以问题不在于此。我在这里想念什么?

    最佳答案

    我遇到了同样的问题,this answer帮助我调试了问题
    我引用它以防万一它被删除

    1. In terminal type lldb path/to/build.app
    2. In the opened debugger type run --remote-debugging-port=8315. It should open a window of your app.
    3. Open Chrome at http://localhost:8315/
    4. Click on the name of the app. For example, Webpack App.
    5. If you don't see anything in the opened tab, focus on the window of your app.

    然后在终端中,检查此错误: The ChromeDriver could not be found on the current PATH. Please download the latest version of the ChromeDriver from http://chromedriver.storage.googleapis.com/index.html and ensure it can be found on your PATH.如果是这种情况,则 download the latest version of chromedriver并将二进制文件添加到项目的根目录。
    再次运行构建,它应该可以工作!
    编辑:
    您面临的问题是无法执行app.asar中的二进制文件,因此,可以快速解决此问题:
    在package.json上,将以下属性添加到“build”对象 "asar": false它应该看起来像这样:
    .
    .
    .
    "build": {
    "appId": "my.id",
    "asar": false,
    "files": [
    "app/**/*",
    "node_modules/**/*",
    "package.json"
    ],
    "mac": {
    "category": "your.app.category.type"
    },
    },
    .
    .
    .
    编辑#2:
    Electron Builder自动解压缩可执行二进制文件,因此以下解决方案为我工作。
    运行 npm install chromedriver在您构建chromedriver的那一部分上,将其构建方式更改为此:
    const chromedriverPath = require('chromedriver').path.replace('app.asar', 'app.asar.unpacked');
    const serviceBuilder = new ServiceBuilder(chromedriverPath);
    let driver = new webdriver.Builder()
    .forBrowser("chrome")
    .setChromeService(serviceBuilder)
    .build();
    这样,驱动程序将获得正确的chromedriver二进制文件的解压缩路径。

    关于javascript - Selenium Webdriver在Electron build中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57144068/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com