Selenium webdriver。如何通过selenium网格运行测试时安装chrome扩展?

问题描述 投票:1回答:1

我尝试在本地运行我的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

任何加载扩展的注释变体都会给出相同的结果。

节点和独立运行类型之间是否存在任何差异(在扩展加载的上下文中)?还是我的错误?

我会很高兴得到任何帮助!

node.js selenium google-chrome selenium-webdriver
1个回答
0
投票

最近弄清楚了解决方案,它非常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');
}
© www.soinside.com 2019 - 2024. All rights reserved.