在 selenium 的使用中,遇到过 使用 npm install selenium-webdriver 安装了 webdriver 驱动,但是仍找不到驱动的情况。错误信息如下:
Error: 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.
at Error (<anonymous>)
at new ServiceBuilder (/var/www/nodejs/node_modules/selenium-webdriver/chrome.js:51:11)
at getDefaultService (/var/www/nodejs/node_modules/selenium-webdriver/chrome.js:216:22)
at new Driver (/var/www/nodejs/node_modules/selenium-webdriver/chrome.js:470:32)
at Builder.build (/var/www/nodejs/node_modules/selenium-webdriver/builder.js:302:14)
at Object.handle (/var/www/nodejs/node.js:31:4)
at next_layer (/var/www/nodejs/node_modules/express/lib/router/route.js:103:13)
at Route.dispatch (/var/www/nodejs/node_modules/express/lib/router/route.js:107:5)
at c (/var/www/nodejs/node_modules/express/lib/router/index.js:195:24)
at Function.proto.process_params (/var/www/nodejs/node_modules/express/lib/router/index.js:251:12)
在Windows环境下,网上有说通过将 ChromeDriver 所在路径配置到系统环境变量中。这种方式我没试过,可能不太方便,因为开发的客户端可能要安装到多个电脑上,配置环境变量的方式就有点麻烦了。
于是,找到了一种可以配置 chromedriver 路径的使用方式。
// 点击按钮,打开系统
var webdriver = require('selenium-webdriver'),
By = webdriver.By,
Key = webdriver.Key,
until = webdriver.until;
var chrome = require("selenium-webdriver/chrome");
var fs= require("fs");
var options = new chrome.Options();
options.addArguments("--start-maximized"); // 启动就最大化,而不是像后面再使用 maximize() 那样之后再最大化
options.addArguments("--disable-popup-blocking");
options.addArguments("no-sandbox");
options.addArguments("disable-extensions");
options.addArguments("no-default-browser-check");
if(chrome.getDefaultService() == null) {
var service;
// exe 安装之后在根目录找到chromedriver.exe
if(fs.existsSync(path.join(__dirname, '../../chromedriver.exe'))) {
console.log(path.join(__dirname, '../../chromedriver.exe'));
service = new chrome.ServiceBuilder(path.join(__dirname, '../../chromedriver.exe')).build();
}
// 开发过程中寻找 chromedriver
if(fs.existsSync(path.join(__dirname, './chromedriver.exe'))) {
console.log(path.join(__dirname, './chromedriver.exe'));
service = new chrome.ServiceBuilder(path.join(__dirname, './chromedriver.exe')).build();
}
chrome.setDefaultService(service);
}
driver = new webdriver.Builder()
.setChromeOptions(options)
.withCapabilities(webdriver.Capabilities.chrome())
.forBrowser('chrome')
.build();
这里通过 chrome.ServiceBuilder 的方式指定了 chromedriver 的路径。需要注意的是,我是在 electron 中使用的 chromedriver,chromedriver 放在 main.js 同一目录,开发过程中使用 ‘./chromedriver.exe’ 就可以了(nodejs 中 __dirname 指的 main.js 所在的目录)。打包之后,main.js 在 resources\app.asar 里,而 chromedriver 与 resources 目录在同一目录下,所以需要使用 ‘…/…/chromedriver.exe’ 来获取chromedriver。