我尝试在本地运行我的chrome扩展测试。
我有selenium-server(v.3.141.59)。
我有chromedriver(v.2.44)
我有chrome浏览器(v.70.0.3538.110)
和selenium-webdriver npm包(v。^ 4.0.0-alpha.1)
我的NodeJs代码成功创建了新的chrome会话
this._driver = new Builder()
.forBrowser('chrome')
.usingServer('http://localhost:4444/wd/hub')
.setChromeOptions(new ChromeOptions()
.addExtensions(config.extensionPath)
//.addExtensions(buffer.toString('base64'))
//.addArguments(`--load-extension=c:\path\to\extension`)
.build();
但
1)当我将selenium-server作为独立服务器运行时,我的扩展已成功安装,没关系
java -jar selenium-server.jar -role standalone
2)当我运行selenium-server作为集线器和另一个selenium-server实例作为节点新的chrome会话创建时没有安装扩展。
java -jar selenium-server.jar -role hub
java -Dwebdriver.chrome.driver=C:\path\to\chromedriver -jar selenium-server.jar -port 4445 -hub http://localhost:4444 -role node -browser browserName=chrome
任何加载扩展的注释变体都会给出相同的结果。
节点和独立运行类型之间是否存在任何差异(在扩展加载的上下文中)?还是我的错误?
我会很高兴得到任何帮助!
最近弄清楚了解决方案,它非常hacky。在selenium的github中有一个关于这个问题的帖子,但目前还不记得了。解决方案是在使用远程集线器时将chrome选项功能键作为'goog:chromeOptions'传递。
例:
setup() {
const options = new Options();
options.addArguments("disable-infobars");
options.addArguments("start-maximized");
options.addExtensions(this.encode(*extension*.crx'));
const caps = new Capabilities();
caps.set("browserName", 'chrome');
//seems like neccessary hack for js bindings
caps.set('goog:chromeOptions', options['options_']);
let driver = await new Builder()
.forBrowser('chrome')
.withCapabilities(caps)
.usingServer(*url*)
.build();
}
encode(file) {
var stream = require('fs').readFileSync(file);
return Buffer.from(stream).toString('base64');
}