Selenium Webdriver。通过硒网格运行测试时如何安装chrome扩展程序?

时间:2018-12-04 13:39:15

标签: node.js selenium google-chrome selenium-webdriver

我尝试在本地运行我的chrome扩展程序的测试。

我有selenium服务器(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

任何评论的加载扩展变体都会产生相同的结果。

运行的节点类型和独立类型之间是否有任何区别(在扩展加载的情况下)? 还是我的错误在哪里?

我将很高兴为您提供帮助!

1 个答案:

答案 0 :(得分:0)

最近想出了解决方案,这很麻烦。 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');
}