node.js - 如何使用 Selenium Webdriver Nodejs 为一个配置文件运行两个 Chrome 驱动程序?

标签 node.js selenium testing

我编写测试,为了速度,我想要的是,该用户已经过身份验证(+ 在本地存储中加载数据)。

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/

相关文章:

javascript - 无法从 Facebook 登录获取电子邮件(API 版本 2.8)

javascript - 获取包含 mongoose 模型数据的列表的函数

java - 我应该为 DAO 测试类使用@Transactional 还是@Rollback?

java - 为了单元测试添加 'Getters' 和 'Setters'?

ruby-on-rails - 如何测试回形针 URL?

javascript - 使用函数作为原型(prototype)

javascript - 如何将路由连接到 server.js

java - Appium Java 客户端版本与 Selenium 版本

java - Selenium - 在执行期间未找到通过 xPath 搜索元素,但在浏览器上找到了它

python - 使用 selenium 和 python 从弹出窗口下载并保存多个 csv 文件