我正在使用Protractor进行端到端测试。我正在处理的应用程序部分首先使用ng-switch语句在注册过程中显示/隐藏问题,一次一个。在问题之间有动画给了我最难的时间。例如,尝试加载页面 - >转到下一个问题 - >断言元素存在是很困难的。该脚本将加载页面,单击下一个按钮,然后在屏幕上显示下一张幻灯片之前进行断言。
更糟糕的是,在问题之间大约半秒钟,旧问题和新问题都存在于DOM上。我能想到的最好的非睡眠等待机制是做一个browser.wait(),它首先等待DOM上有两个问题,然后链接另一个browser.wait()等待那里只有一个再次询问DOM,然后从那里开始。 (整个操作包含在代码中的registerPage.waitForTransition()中
browser.wait()s并不总是阻塞足够长的时间,所以我最终编写了如下代码:
it('moves to previous question after clicking previous link', function() {
var title;
// Get the current slide title, then click previous, wait for transition,
// then check the title again to make sure it changed
registerPage.slideTitle.getText()
.then(function(text) {
title = text;
})
.then(registerPage.prevLink.click())
.then(registerPage.waitForTransition())
.then(function() {
expect(registerPage.slideTitle.getText()).not.toBe(title);
});
});
以确保在执行下一个命令之前正确完成每个等待。现在这完美无缺。之前发生的事情是,测试将在95%的时间内成功,但偶尔会在转换实际完成100%之前触发断言或下一次点击操作等。这种情况不再发生了,但我觉得这几乎是在承诺上过度使用.then()。但与此同时,强迫一切顺序发生是有道理的,因为这与网站的互动实际上是如何运作的。加载页面,然后等待下一个按钮滑入,然后进行选择,然后单击下一个按钮,然后等待下一张幻灯片等。
我是在一个完全糟糕的练习风格中这样做的,还是在具有大量动画的应用上使用Protractor时这是否可以接受使用承诺?
答案 0 :(得分:3)
我喜欢这类代码审核问题,所以感谢发帖。
我认为你的一些.then
是不必要的。 .click()
和expect
不应该需要它们,因为它们应该添加到controlFlow
中。 expect
也应该处理getText()
的承诺。
您遇到的问题似乎属于waitForTransition()
方法,在controlFlow
之外运行。根据您在此方法中处理等待的方式,您可能需要自己将其添加到controlFlow
。例如。你在调用非webdriver命令吗?在这样的情况下使用Expected Conditions isClickable()
我也很幸运。
此外,在需要等待时,我还会将大部分代码卸载到您的页面对象,尤其是。例如,如果您向页面对象添加类似的内容:
registerPage:
this.getSlideTitleText = function() {
return this.slideTitle.getText().then(function(text) {
return text;
});
};
this.clickPrevLink = function() {
this.prevLink.click();
return this.waitForTransition(); // fix this and the rest should work
};
然后你的测试可能是......
it('moves to previous question after clicking previous link', function() {
var title = registerPage.getSlideTitleText();
registerPage.clickPrevLink();
expect(registerPage.getSlideTitleText()).not.toBe(title);
});