我的页面上有一个滑块菜单,在动画播放一段时间后出现。我想知道如何在不使用browser.wait(condition, timeout)
的情况下处理点击操作,因为这取决于在远程数据库中获取数据的网络流量。
页面渲染可能需要很长时间,因此量角器会触发超时错误。我一直试图使用jQuery来等待所有转换和动画事件完成,但它仍然无法正常工作。
BasePage.prototype.clickMenuButton = function(menuName) {
var link = element(by.linkText(menuName));
browser.ignoreSynchronization = true;
browser.executeScript("jQuery('html > *').one('animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd', function(){})").then(
function() {
link.click();
},
function (error) { console.log("Error : ", error); }
);
}
有没有人知道在不使用browser.wait
和超时的情况下等待angularjs完成渲染和动画的方法?
答案 0 :(得分:0)
这是与Angular JS的Protractor“不兼容”。大多数人称这是一个错误,但没有人确定这一点。
但是,如果出现此问题,Angular和Protractor团队建议为了修复$ timeout等待,用$ interval函数替换$ timeout函数。他们几乎是一样的,他们都达到了同样的目的。
$ interval函数修复了量角器$ timeout问题。
Official documentation声明您应该将$ interval用于连续轮询的任何内容(在Angular 1.2rc3中引入)。
在这种情况下,$ timeout对于前端开发人员(AngularJS开发人员)而言,对于JavaScript自动化开发人员(量角器开发人员)来说都不是一个好选择。
另一种选择是在测试应用程序中使用超时,或关闭浏览器同步。 这是我的ignoreSynchronization函数的例子。
browser.ignoreSynchronization = true;
browser.wait(toast.isPresent(), 3000).then(
function(arr) {
if (arr) {
toast.getText().then(function(txt) {
// console.log(txt);
expect(txt).toContain(caption);
});
} else {
toast.getText().then(function(txt) {
console.log('current toast: ' + txt);
console.log('modal not catched. see bug with $timeout \n ' +
caption + " \n" +
"==> Error! NOT PRESENT");
});
}
}
);
browser.ignoreSynchronization = false;
您还可以查看their official github issue tracker。这个页面说明如果你有一个$ timeout函数,开发人员不能改变它(这似乎有点不太可能,并且看起来像是一个糟糕的QA / dev关系)你应该使用ignoreSynchronization函数。
主要结论是,为了修复量角器$ timeout等待Angular,前端开发人员应该很容易用$ interval替换$ timeout 。
如果有帮助,请告诉我。