如何获得量角器可靠的结果?

时间:2015-03-19 17:46:01

标签: javascript angularjs testing selenium-webdriver protractor

我使用Protractor(v 1.3.1)为我的Angular 1.2.26应用程序运行E2E测试。

但有时,测试还可以,有时候没有。似乎有时检查是在显示更新之前完成的(或类似"同步"问题)。 我尝试了很多选择:

  • 添加browser.driver.sleep说明,
  • 使用browser.executeScript('$.fx.off = true')
  • 停用效果
  • 添加browser.waitForAngular()说明

没有成功。

使用量角器对E2E测试进行重新安装的最佳做法是什么?

JM。

4 个答案:

答案 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 runswaitsFor函数来模拟此行为。

请注意,使用量角器的全部意义在于Protractor应该知道Angular何时完成。所以原则上,不需要调用waitForAngular(我自己的测试套件有几十个场景不包括单个wait / waitForAngular)。您的测试应用程序越符合Angular的设计原则,您需要的WaitForAngular就越少。

答案 3 :(得分:1)

我想补充一点,禁用ngAnimate可能还不够。您可能还必须通过注入CSS(What is the cleanest way to disable CSS transition effects temporarily?)来禁用所有过渡动画。