【发布时间】:2020-10-24 22:23:52
【问题描述】:
我正在为 Web 应用程序编写测试自动化。我需要测试的产品支持的功能之一如下。不同的用户可以同时在不同的机器上登录,当用户 1 在机器 1 上输入一些数据时,机器 2 上的用户 2 的视图会自动实时更新这些数据,而无需重新加载浏览器.
我最初研究使用 Selenium 网格来控制多台机器来运行这些测试,但看起来不可能让特定步骤以特定顺序在特定机器上运行,这是必要的。因此,我正在考虑使用不同的 Chrome 配置文件在一台机器上运行所有内容。
到目前为止,我的示例代码如下所示:
var selenium1 = require('selenium-webdriver');
var selenium2 = require('selenium-webdriver');
const chrome1 = require('selenium-webdriver/chrome');
const chrome2 = require('selenium-webdriver/chrome');
var udd = "C:\\Users\\phil\\AppData\\Local\\Google\\Chrome\\User Data\\";
var pd1 = "Profile 5";
var pd2 = "Profile 6";
const chromeOptions1 = new chrome1.Options();
chromeOptions1.addArguments(`user-data-dir=${udd}`);
chromeOptions1.addArguments(`profile-directory=${pd1}`);
const chromeOptions2 = new chrome2.Options();
chromeOptions2.addArguments(`user-data-dir=${udd}`);
chromeOptions2.addArguments(`profile-directory=${pd2}`);
var driver1 = new selenium1.Builder()
.forBrowser("chrome")
.setChromeOptions(chromeOptions1)
.build();
var driver2 = new selenium2.Builder()
.forBrowser("chrome")
.setChromeOptions(chromeOptions2)
.build();
jasmine.DEFAULT_TIMEOUT_INTERVAL = 90000;
describe('multiple browser test', function () {
afterAll(async function () {
await driver1.quit();
await driver2.quit();
});
it('can open a web page', async function () {
await driver1.get("http://www.yahoo.com");
await driver2.get("http://www.bing.com");
await driver1.sleep(5000);
await driver2.sleep(5000);
});
});
这似乎有效,除了一件事。当调用await driver2.quit(); 行时,出现错误:
Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:[port number]
第二个浏览器窗口没有关闭。
问题是:
-
Selenium 是否支持我正在尝试做的事情?
-
如果支持,我的代码有什么明显的问题吗?我在这里阅读了许多相关问题,以及其他地方的文档,但看起来让 Selenium 使用特定浏览器配置文件的过程随着时间的推移而发生了变化,所以我不能 100% 确信我现在所拥有的内容是正确的。
-
该错误消息来自哪里,它是什么意思?当我搜索它时,它似乎与 Selenium Grid 相关,正如我之前所说,我不会使用它。
【问题讨论】:
-
简短的回答是不,您不能在多个 Chrome 会话中使用多个配置文件(用户定义目录)。但是,您可以通过使用两个不同的浏览器 WebDriver 实例(例如 Chrome 和 FF)轻松实现您想要实现的目标。如果配置文件可以解决,您可以在单个 Chrome 实例中使用多个选项卡/窗口。
-
该错误消息来自这样一个事实,即您已经使用两个驱动程序创建了两个会话,但是当您发出
.quit命令时,它会终止 Chrome 会话。然后对.quit()的第二次调用不再有要关闭的会话(要连接的浏览器)-因此会生成 econnrefused 错误。 -
因此,即使它打开了两个不同的 Chrome 窗口,并且我复制了创建它们的所有内容(chrome、chromeOptions、驱动程序等),下面仍然只有一个 Chrome 会话?我永远不会猜到这一点。很高兴知道,谢谢。
-
这不是一个真正的 Chrome 会话,它是一个驱动程序实例。有问题的是 Selenium 实例。
-
打开两个Chrome窗口/标签并分别控制它们非常容易,你不能有不同的
user-data-dir's
标签: javascript selenium selenium-webdriver