Javascript Selenium webdriver在Electron构建中不工作
我有一个electron项目,它呈现一个带有按钮的html页面,单击该按钮时调用一个节点js脚本(通过IPC),该脚本使用selenium来刮取网页 以下是我的项目结构: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.
-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>
npm start
从事开发工作时,这一点非常有效
但是,当我通过npm run script pack
或npm run script dist
打包应用程序时,生成版本不会达到步骤3。不会弹出任何权限窗口,也不会打开任何浏览器。硒在那里根本不起作用
我确信IPC在构建版本中从index.js运行到main.js,所以问题不在于此。我在这里遗漏了什么?我也遇到了同样的问题,并帮助我调试了这个问题
我引用它以防被删除
lldb path/to/build.app
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();