在我的测试类中的beforeEach函数下有问题。
单击usersTab有时可以正常工作,有时会返回StaleElementReferenceException
。
已尝试protractor.ExpectedConditions
presenceOf
或visibilityOf
或elementToBeClickable
,但均未100%合作。
我认为这是由异步引起的,有时浏览器首先要点击然后等待 - 是否可能?
知道如何处理吗?
var OnePage = require('../pages/one_page.js');
var SecondPage = require('../pages/second_page.js');
describe('Test', function () {
var onePage;
var secondPage;
var EC = protractor.ExpectedConditions;
beforeEach(function () {
browser.ignoreSynchronization = true;
onePage = new OnePage();
browser.wait(EC.presenceOf(onaPage.userLogin), 5000);
onePage.setUser('login@login');
onePage.setPassword('password');
onePage.login();
secondPage = new SecondPage();
browser.wait(EC.visibilityOf(secondPage.usersTab), 10000);
usersPage.usersTab.click();
});
我正在使用jasmine:2
和protractor:2.2.0
。
答案 0 :(得分:1)
当我第一次开始构建我的测试套件时,我遇到了类似的问题,我花了一些时间来追踪解决方案。使用var
函数中的标准beforeEach
初始化页面对象时,它可以在运行第二个或更高的测试时保留旧实例。不知道它通常需要多长时间或者在我的测试中真正触发了打嗝,这对我来说总是随机的。我能解决此问题的唯一方法是在我的this
函数中使用beforeEach
关键字,如下例所示。执行beforeEach
函数时,在每次测试中都会正确更新实例。
注意:在onPrepare
下的conf.js文件中,我有以下函数设置告诉Protractor,以下页面是否是Angular页面:
global.isAngularSite = function(flag) {
browser.ignoreSynchronization = !flag;
};
var OnePage = require('../pages/one_page.js');
var SecondPage = require('../pages/second_page.js');
describe('Test', function () {
beforeEach(function () {
isAngularSite(true);
this.onePage = new OnePage();
this.secondPage = new SecondPage();
this.ec = protractor.ExpectedConditions;
browser.wait(this.ec.presenceOf(this.onePage.userLogin), 5000);
this.onePage.setUser('login@login');
this.onePage.setPassword('password');
this.onePage.login();
browser.wait(this.ec.visibilityOf(this.secondPage.usersTab), 10000);
usersPage.usersTab.click();
});
it('', function() {
});
});
答案 1 :(得分:0)
尝试将操作相互链接,以便一旦第一个完成解决其承诺,它们就会串行执行。这是怎样的 -
beforeEach(function () {
browser.ignoreSynchronization = true;
onePage = new OnePage();
browser.wait(EC.presenceOf(onaPage.userLogin), 5000).then(function(){
onePage.setUser('login@login');
onePage.setPassword('password');
onePage.login();
});
secondPage = new SecondPage();
browser.wait(EC.visibilityOf(usersPage.usersTab), 10000).then(function(){
usersPage.usersTab.click().then(function(){
//If you want to verify something after click, do it here.
browser.sleep(500);
});
});
});
如果您希望第二页操作仅在第一页之后完成,则将它们链接在一起。
browser.wait(EC.presenceOf(onaPage.userLogin), 5000).then(function(){
//Actions of OnePage
}).then(function(){
//Actions of second page
secondPage = new SecondPage();
browser.wait(EC.visibilityOf(usersPage.usersTab), 10000).then(function(){
usersPage.usersTab.click().then(function(){
//If you want to verify something after click, do it here.
browser.sleep(500);
});
});
});
希望这有帮助。