将require('chromedriver').path直接传递给selenium-webdriver

20

tl;dr: 有没有人知道如何在代码中将chromedriver的路径传递给selenium-webdriver,而不设置PATH环境变量?

我正在尝试使用selenium-webdriver与chrome一起使用,但是我希望不必实际安装chromedriver并操纵路径。我有以下代码:

var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
    withCapabilities(webdriver.Capabilities.chrome()).
    build();

如果未设置chromedriver的路径,则会引发此错误:

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.

我希望不用设置路径,所以我从npm安装了chromedriver并将其添加到我的package.json:

"scripts": {
    "preinstall-chromedriver": "npm install",
    "install-chromedriver": "node node_modules/chromedriver/install.js",
    "pretest_e2e": "npm run install-chromedriver",
    "test_e2e": "node release/test/rune2e.js"
},

现在我已经安装了chromedriver并可以使用require('chromedriver').path获取路径,但我无法将其传递给selenium-webdriver。 有人知道吗?

3个回答

48

你需要创建并设置自己的默认 Chrome 服务。

var webdriver = require('selenium-webdriver');
var chrome = require('selenium-webdriver/chrome');
var path = require('chromedriver').path;

var service = new chrome.ServiceBuilder(path).build();
chrome.setDefaultService(service);

var driver = new webdriver.Builder()
    .withCapabilities(webdriver.Capabilities.chrome())
    .build();

我对node.js还不熟悉,第二行是否有错误?因为selenium-webdriver中没有chrome,但你仍然写着var chrome=require('selenium-webdriver/chrome');。即使这样做了,我仍然会收到一个错误“SyntaxError: Error parsing /home/abc/node_modules/selenium-webdriver/package.json: Unexpected token /”。 - Abhishek Tripathi
1
require('selenium-webdriver/chrome') 的意思是加载 selenium-webdriver npm 安装包内的 chrome.js 文件。这应该可以正常工作。但是,我认为您可能有一个损坏的 package.json 文件(您不应该看到未解决引用的解析错误)。您是否对此文件进行了任何更改? - jt000
是的,您建议在package.json中进行的更改。 - Abhishek Tripathi
1
这应该放在您的包的package.json文件中,而不是像SyntaxError中提到的"selenium-webdriver/package.json"。 - jt000
我遇到了这个错误:服务器早期退出,状态为0。 - albanx

8
您也可以这样做:
require('chromedriver');
const webdriver = require('selenium-webdriver');

const driver = new webdriver.Builder()
    .withCapabilities(webdriver.Capabilities.chrome())
    .build();

2
这很简单,我喜欢它!但是,你应该使用path.delimiter而不是; - Stefan Dragnev
这是否解决了原来的问题?看起来你只是将我的上面答案中的“webdriver”变量内联了。也许我误解了... - jt000
1
这里的想法是您不需要构建一个服务。诀窍在于 require('chromedriver'); 将会将 chromedriver 路径添加到 process.env.PATH 中。由于这个原因,如果请求具有 chrome 能力的驱动程序,则 selenium-webdriver 将能够启动 chromedriver。 - mucsi96

0
Option 1:
process.env.PATH = 'path to chrome driver binary folder';
var driver = new Builder().forBrowser('chrome').build();

Option 2:
install chromedriver (npm install chromedriver)
require('chromedriver'); in your code

//chrome driver will automatically look for chromedriver or chromedriver.exe in the path mentioned based on OS
reference: 
https://github.com/SeleniumHQ/selenium/blob/master/javascript/node/selenium-webdriver/chrome.js line 142
https://github.com/SeleniumHQ/selenium/blob/master/javascript/node/selenium-webdriver/io/index.js line 237

谢谢,选项1可能可行,但选项2使用了PATH环境变量,而问题明确说明不想设置它。 - jt000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接