我使用Protractor(v 1.3.1)为我的Angular 1.2.26应用程序运行E2E测试。
但有时,测试还可以,有时候没有。似乎有时检查是在显示更新之前完成的(或类似"同步"问题)。 我尝试了很多选择:
browser.driver.sleep
说明,browser.executeScript('$.fx.off = true')
browser.waitForAngular()
说明没有成功。
使用量角器对E2E测试进行重新安装的最佳做法是什么?
JM。
答案 0 :(得分:13)
每次遇到类似问题时,我都会browser.wait()
使用"Expected Conditions"(introduced in protractor 1.7)。有一组通常足够的内置预期条件,但您可以轻松定义自定义预期条件。
例如,等待元素变为可见:
var EC = protractor.ExpectedConditions;
var e = element(by.id('xyz'));
browser.wait(EC.visibilityOf(e), 10000);
expect(e.isDisplayed()).toBeTruthy();
很少注意到:
如果不符合条件且会引发超时错误,您可以指定自定义错误消息,请参阅Custom message on wait timeout error:
browser.wait(EC.visibilityOf(e), 10000, "Element 'xyz' has not become visible");
您可以将EC
设置为指向protractor.ExpectedConditions
的全局可用变量。将此行添加到配置中的onPrepare()
:
onPrepare: function () {
global.EC = protractor.ExpectedConditions;
}
作为自定义预期条件的示例,请参阅this answer
答案 1 :(得分:2)
使用Protractor测试非常重要的另一点是理解ControlFlow。您可以在此处找到解释和代码示例:When should we use .then with Protractor Promise?
让马克
答案 2 :(得分:2)
有两件事需要考虑。
首先,您应该正确排序所有量角器动作(同样由@ jmcollin92暗示)。为此,我通常在每个步骤使用.then
。
第二个重要的事情是确保新的测试it(...)
仅在上一个it(...)
完成后才开始。
如果您使用最新版本的Protractor,您可以使用Jasmine 2.x及其支持信号来完成测试:
it('should do something', function(done) {
clicksomething().then(function() {
expect(...);
done();
});
});
这里调用done
参数来表示测试已准备就绪。如果没有这个,Protractor将安排 clicksomething
命令,然后立即继续进行下一次测试,仅在clicksomething
完成后返回当前测试。
由于通常两个测试都会检查并可能修改相同的浏览器/页面,如果你让它们同时发生(一个测试点击到下一页,而另一个测试仍在检查上一页),你的测试将变得不可预测。
如果您使用早期版本的Protractor(1.3指示),可以使用Jasmine 1.3 runs
和waitsFor
函数来模拟此行为。
请注意,使用量角器的全部意义在于Protractor应该知道Angular何时完成。所以原则上,不需要调用waitForAngular
(我自己的测试套件有几十个场景不包括单个wait / waitForAngular)。您的测试应用程序越符合Angular的设计原则,您需要的WaitForAngular
就越少。
答案 3 :(得分:1)
我想补充一点,禁用ngAnimate可能还不够。您可能还必须通过注入CSS(What is the cleanest way to disable CSS transition effects temporarily?)来禁用所有过渡动画。