我编写测试,为了速度,我想要的是,该用户已经过身份验证(+ 在本地存储中加载数据)。
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 并使用相同的配置文件启动它两次,那么在您第二次启动它时,Chrome 将检测到已经有一个 Chrome 实例正在使用您选择的配置文件运行,并将指示此 Chrome例如打开一个新窗口。我不知道您会在 Windows 的控制台上看到什么,但在 Linux 上,当您第二次尝试启动 Chrome 时,您会在控制台上看到:
Created new window in existing browser session.
因此,尽管看起来您有一个不同的 Chrome 实例,但实际上您只有一个带有两个窗口的实例。我不认为可以强制 Chrome生成具有相同配置文件的第二个实例。
然后你就有了Selenium。当您使用 Builder
创建一个新的 Selenium 实例时,Selenium 会执行 Chrome,但您已经从我上面的解释中知道,第二次执行时,Chrome 只会在第一个 Chrome 实例中打开一个新窗口你开始了。 Selenium 不会检测到这一点,但会尝试连接到浏览器来控制它。但是,当您要求 Selenium 生成第一个 Chrome 实例时,Selenium 已经连接到浏览器,并且它无法再次连接到同一个实例。如果您等待足够长的时间,一个将发生超时,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',
[...]
如果您的配置文件包含您在启动 Selenium 脚本之前所需的凭据,您可以将配置文件复制到第二个 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);
});
关于node.js - 如何使用 Selenium Webdriver Nodejs 为一个配置文件运行两个 Chrome 驱动程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279574/