Javascript Selenium webdriver在Electron构建中不工作

Javascript Selenium webdriver在Electron构建中不工作,javascript,node.js,selenium-webdriver,electron,electron-builder,Javascript,Node.js,Selenium Webdriver,Electron,Electron Builder,我有一个electron项目,它呈现一个带有按钮的html页面,单击该按钮时调用一个节点js脚本(通过IPC),该脚本使用selenium来刮取网页 以下是我的项目结构: -app/ --index.html --main.js --index.js -package.json 这是我的package.json: { "name": "agencies-scraper", "version": "1.0.

我有一个electron项目,它呈现一个带有按钮的html页面,单击该按钮时调用一个节点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>

  • 在main.js中,我收听“backchannel”,当触发时,实例化selenium webdriver并在单独的chrome浏览器中打开google.com:
  • 操作系统询问我是否希望electron应用程序接受传入连接,我单击“允许”(selenium会打开浏览器):
  • 当我通过
    npm start
    从事开发工作时,这一点非常有效

    但是,当我通过
    npm run script pack
    npm run script dist
    打包应用程序时,生成版本不会达到步骤3。不会弹出任何权限窗口,也不会打开任何浏览器。硒在那里根本不起作用

    我确信IPC在构建版本中从index.js运行到main.js,所以问题不在于此。我在这里遗漏了什么?

    我也遇到了同样的问题,并帮助我调试了这个问题

    我引用它以防被删除

  • 在终端类型中
    lldb path/to/build.app
  • 在打开的调试器中,键入运行远程调试端口=8315。它应该会打开你的应用程序窗口
  • http://localhost:8315/
  • 单击应用程序的名称。例如,
    Webpack应用程序
  • 如果在打开的选项卡中看不到任何内容,请关注应用程序的窗口
  • 然后在终端中检查此错误:

    在当前路径上找不到ChromeDriver。请从下载最新版本的ChromeDriverhttp://chromedriver.storage.googleapis.com/index.html 并确保它可以在您的路径上找到。

    如果是这样的话,那么将二进制文件添加到项目的根目录中

    再次运行构建,它应该可以工作

    编辑: 您面临的问题是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安装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二进制文件的正确解包路径。

    非常感谢,选项#1解决了我的问题!
    .
    .
    .
            "build": {
                "appId": "my.id",
                "asar": false,
                "files": [
                    "app/**/*",
                    "node_modules/**/*",
                    "package.json"
                ],
                "mac": {
                    "category": "your.app.category.type"
                },
            },
    .
    .
    .
    
    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();