如何开启多个windows或操作多个实例
How do I open multiple windows or operate multiple instances
如果出于某种疯狂的原因我需要打开 100 个 windows/tabs 并导航到其中的 100 个不同链接,我该怎么做?我可以在全部 100 个测试中同时 运行 某些测试吗?
假设我有一个数组 ['a','b','c','d','e'],我需要测试是否有某种形式适用于所有这些值。如何打开 5 个实例(或 windows 或任何可以独立于其余实例控制的实例)并同时测试它们?
例如:
- 找到表单的输入文本框,
- 将文本值更改为数组的
之一
- 点击提交按钮
- 运行 某断言
等等,所有这些都是并行的。同时测试所有数组值而不是一个一个地测试
upd:我想我可以使用
打开多个选项卡
browser.executeScript("window.open('https://angularjs.org/', 'tab" + i + "')")
但这并不允许我真正地 运行 并行测试,因为我将不得不从一个选项卡跳到另一个选项卡,
假设所有选项卡都打开并加载:
1) 从数组中选取值
2)修改输入框
3)点击提交按钮
4)切换到下一个标签
5) 重复
是的,这仍然比在一个选项卡中测试所有内容、遍历数组并每次都重置页面要快,但我需要找到更好的方法
仅仅为了 运行 非常相似的场景而启动 100 个不同的浏览器听起来效率非常低。如果这些不同的值启动相同的流程,只是输出略有不同,您可能希望对这些值使用单元测试,并且 运行 只有一个或少数使用量角器进行端到端测试。
但要回答您的问题,有两种方法。
1) multiCapabilities
:这里,每个浏览器都会运行完全不同的测试。 (如果您的测试相似,您可能希望重用一个公共组件)。
exports.config = {
specs: [
// leave this empty if you have no shared tests.
],
multiCapabilities: [{
'browserName': 'chrome',
'specs': ['test1.js']
}, {
'browserName': 'chrome',
'specs': ['test2.js']
}, {
'browserName': 'chrome',
'specs': ['test3.js']
}],
};
文档:https://github.com/angular/protractor/blob/master/docs/referenceConf.js
2) browser.forkNewDriverInstance()
:在这里,您只运行 一个测试,但是测试可以产生n
不同的浏览器。缺点是因为一切都在 1 次测试中,如果 100 次中有 1 次失败,你只会得到一次失败。
var runtest = function(input, output) {
var newBrowser = browser.forkNewDriverInstance(true); // true means use same url
// note I used newBrowser.element instead of element, because you are accessing the new browser.
newBrowser.element(by.model(...)).sendKeys(input).click();
expect(newBrowser.element(by.css('blah')).getText()).toEqual(output);
};
describe('...', function() {
it('spawn browsers', function() {
browser.get(YOUR_COMMON_URL);
runtest('input1', 'output1');
runtest('input2', 'output2');
runtest('input3', 'output3');
runtest('input4', 'output4');
});
});
如果出于某种疯狂的原因我需要打开 100 个 windows/tabs 并导航到其中的 100 个不同链接,我该怎么做?我可以在全部 100 个测试中同时 运行 某些测试吗?
假设我有一个数组 ['a','b','c','d','e'],我需要测试是否有某种形式适用于所有这些值。如何打开 5 个实例(或 windows 或任何可以独立于其余实例控制的实例)并同时测试它们? 例如:
- 找到表单的输入文本框,
- 将文本值更改为数组的 之一
- 点击提交按钮
- 运行 某断言 等等,所有这些都是并行的。同时测试所有数组值而不是一个一个地测试
upd:我想我可以使用
打开多个选项卡browser.executeScript("window.open('https://angularjs.org/', 'tab" + i + "')")
但这并不允许我真正地 运行 并行测试,因为我将不得不从一个选项卡跳到另一个选项卡, 假设所有选项卡都打开并加载:
1) 从数组中选取值 2)修改输入框 3)点击提交按钮 4)切换到下一个标签 5) 重复
是的,这仍然比在一个选项卡中测试所有内容、遍历数组并每次都重置页面要快,但我需要找到更好的方法
仅仅为了 运行 非常相似的场景而启动 100 个不同的浏览器听起来效率非常低。如果这些不同的值启动相同的流程,只是输出略有不同,您可能希望对这些值使用单元测试,并且 运行 只有一个或少数使用量角器进行端到端测试。
但要回答您的问题,有两种方法。
1) multiCapabilities
:这里,每个浏览器都会运行完全不同的测试。 (如果您的测试相似,您可能希望重用一个公共组件)。
exports.config = {
specs: [
// leave this empty if you have no shared tests.
],
multiCapabilities: [{
'browserName': 'chrome',
'specs': ['test1.js']
}, {
'browserName': 'chrome',
'specs': ['test2.js']
}, {
'browserName': 'chrome',
'specs': ['test3.js']
}],
};
文档:https://github.com/angular/protractor/blob/master/docs/referenceConf.js
2) browser.forkNewDriverInstance()
:在这里,您只运行 一个测试,但是测试可以产生n
不同的浏览器。缺点是因为一切都在 1 次测试中,如果 100 次中有 1 次失败,你只会得到一次失败。
var runtest = function(input, output) {
var newBrowser = browser.forkNewDriverInstance(true); // true means use same url
// note I used newBrowser.element instead of element, because you are accessing the new browser.
newBrowser.element(by.model(...)).sendKeys(input).click();
expect(newBrowser.element(by.css('blah')).getText()).toEqual(output);
};
describe('...', function() {
it('spawn browsers', function() {
browser.get(YOUR_COMMON_URL);
runtest('input1', 'output1');
runtest('input2', 'output2');
runtest('input3', 'output3');
runtest('input4', 'output4');
});
});