如何控制测试用例在量角器中的不同浏览器上运行

时间:2017-05-31 13:54:16

标签: javascript selenium protractor e2e-testing

test problem

如在测试问题pic中所见,有两个浏览器运行不同的测试用例。我想在运行浏览器(browser1和browser2)上运行规范7,并使用聊天应用程序之类的交互。在两个浏览器上运行规范1到6之后,规范7应该在具有指定测试的两个浏览器上运行。例如:

spec7.js文件:

  • user1从browser1向browser2中的user2发送hello msg。
  • user2在browser2中收到hello msg并从browser2发送msg hi browser1中的user1。

这两个操作都应该在相同的spec7.js文件中完成,并且此文件应该在两个已经为其他specs文件运行的浏览器中运行。 我正在寻求帮助。

2 个答案:

答案 0 :(得分:0)

量角器允许您使用。来解决这个问题 browser.forkNewDriverInstance(opt_useSameUrl, opt_copyMockModules)方法,它将返回一个独立的浏览器对象。从this链接引用Protractor API概述,这是官方文档 -

  

如果您正在测试两个浏览器需要相互交互的应用程序(例如聊天系统),您可以通过在测试中动态创建浏览器来使用量角器来实现。量角器在浏览器对象中公开一个函数来帮助您实现此目的:browser.forkNewDriverInstance(opt_useSameUrl, opt_copyMockModules)。调用此方法将返回一个新的独立浏览器对象。函数中的第一个参数表示您是否希望新浏览器以与您分叉的浏览器相同的URL开头。第二个参数表示您是否希望新浏览器从您分叉的浏览器中复制模拟模块。

browser.get('http://www.angularjs.org');
browser.addMockModule('moduleA', "angular.module('moduleA', []).value('version', '3');");

// To create a new browser.

var browser2 = browser.forkNewDriverInstance();

// To create a new browser with url as 'http://www.angularjs.org':

var browser3 = browser.forkNewDriverInstance(true);

// To create a new browser with mock modules injected:
var browser4 = browser.forkNewDriverInstance(false, true);

// To create a new browser with url as 'http://www.angularjs.org' and 
mock modules injected:
var browser4 = browser.forkNewDriverInstance(true, true);`

我想这就是你要找的东西。根据您提到的问题,您可以特别提及您要执行操作的浏览器对象,例如 - 您可以使用

等方法在第二个实例上验证您的消息
 //get element text in second browser
  var element2=browser2.element;
  element2.getText().then(function(){
     //use an expect to verify the text
 }); 

请仔细阅读上面给出的 link 进一步说明。

答案 1 :(得分:0)

您可以使用两个文件来解决问题。

我尝试用示例聊天应用程序解释它

<强> spec7_browser1.js:

...
//Sends own message
element(by.id('messageInput')).sendKeys('hello'); // Enters hello into the message input field

element(by.id('submitMessage')).click(); // Clicks on the submit button to send the message

expect(element(by.id('chat')).getText()).toContain('hello');

// Waits for the message of browser 2
var EC = protractor.ExpectedConditions;
browser.wait(EC.textToBePresentInElement(element(by.id('chat')), 'hi'), 60000); // Waits until the given text is displayed in the element and fails if the text is not displayed in 60 seconds 

expect(element(by.id('chat')).getText()).toContain('hi');
...

<强> spec7_browser2.js:

...
// Waits for the message of browser 1
var EC = protractor.ExpectedConditions;
browser.wait(EC.textToBePresentInElement(element(by.id('chat')), 'hello'), 60000); // Waits until the given text is displayed in the element and fails if the text is not displayed in 60 seconds 

expect(element(by.id('chat')).getText()).toContain('hello');

// Sends own message
element(by.id('messageInput')).sendKeys('hi'); // Enters hello into the message input field

element(by.id('submitMessage')).click();

expect(element(by.id('chat')).getText()).toContain('hi');
...

等等......

也许您需要在protractor-config.js中增加茉莉花的默认超时时间:

jasmineNodeOpts: {
    ...
    defaultTimeoutInterval: 90000 // 90s timeout
}

我希望这会有所帮助,否则请告诉我,以便我可以改进我的答案; - )