如何使用Selenium Webdriver Nodejs为一个configuration文件运行两个Chrome驱动程序?

我写testing,并为了速度,我想,该用户已被authentication(加载本地存储数据)。

import * as webdriver from 'selenium-webdriver'; import * as Chrome from 'selenium-webdriver/chrome'; var options = new Chrome.Options(); options.addArguments('--user-data-dir=C:\\profilepath'); var driver = new webdriver.Builder().withCapabilities(options.toCapabilities()).build(); driver.get("http://site.ru/").then(() => { console.log('Opened'); }, (err) => { console.log('Err', err); }); var driver2 = new webdriver.Builder().withCapabilities(options.toCapabilities()).build(); driver2.get("http://site.ru/").then(() => { console.log('Opened'); }, (err) => { console.log('Error', err); }); 

第一个驱动程序工作正常,打开页面,第二个只是挂起初始屏幕没有任何错误。 同样的启动他们在不同的过程中…

您有两个实体在这里交叉使用:Chrome和Selenium。

如果您从命令行运行Chrome并使用相同的configuration文件启动它两次,那么第二次启动它时,Chrome会检测到已经有一个运行着您所选configuration文件的Chrome实例,并将指示此Chrome实例打开一个新窗口。 我不知道你会在Windows上的控制台上看到什么,但是在Linux上,第二次尝试启动Chrome时,你可以在控制台上看到:

在现有浏览器会话中创build新窗口。

所以虽然看起来你有不同的Chrome实例,但实际上你只有一个实例有两个窗口。 我不相信有可能强制Chrome生成具有相同configuration文件的第二个实例。

那么你有selenium。 当您使用Builder创build一个新的Selenium实例时,Selenium会执行Chrome,但正如您从上面解释的那样,您已经知道了,第二次,Chrome只是在您启动的第一个Chrome实例中打开一个新窗口。 selenium没有检测到这一点,但试图连接到浏览器来控制它。 但是, Selenium 已经连接到浏览器,当它要求它产生第一个Chrome实例时,它不能再次连接到同一个实例。 如果等待足够长时间,Selenium会报告:

 Error { [UnknownError: unknown error: Chrome failed to start: exited abnormally (Driver info: chromedriver=2.13.307649 (bf55b442bb6b5c923249dd7870d6a107678bfbb6),platform=Linux 4.0.0-2-amd64 x86_64)] code: 13, state: 'unknown error', message: 'unknown error: Chrome failed to start: exited abnormally\n (Driver info: chromedriver=2.13.307649 (bf55b442bb6b5c923249dd7870d6a107678bf 6_64)', name: 'UnknownError', [...] 

如果您的configuration文件包含您在启动Selenium脚本之前所需的凭据,那么您可以将configuration文件复制到第二个Chrome实例的新位置。 它可能是这样的:

 import * as webdriver from 'selenium-webdriver'; import * as Chrome from 'selenium-webdriver/chrome'; import * as fs_extra from 'fs-extra'; // Copy the profile to a new location for the new instance. fs_extra.copySync("/tmp/t6/foo", "/tmp/t6/foo2"); var options = new Chrome.Options(); options.addArguments('--user-data-dir=/tmp/t6/foo'); var driver = new webdriver.Builder().withCapabilities(options.toCapabilities()).build(); driver.get("http://google.com/").then(() => { console.log('Opened'); }, (err) => { console.log('Err', err); }); var options2 = new Chrome.Options(); options2.addArguments('--user-data-dir=/tmp/t6/foo2'); var driver2 = new webdriver.Builder().withCapabilities(options2.toCapabilities()).build(); driver2.get("http://example.com/").then(() => { console.log('Opened'); }, (err) => { console.log('Error', err); });