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

How to have protractor reliable results?

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

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

没有成功。

使用量角器进行可靠的 E2E 测试的最佳实践是什么?

JM.

每次我遇到类似问题时,我都在使用 browser.wait() with (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();

几点注意事项:

  • 您可以指定自定义错误消息,以防不满足条件并抛出超时错误,请参阅 :

    browser.wait(EC.visibilityOf(e), 10000, "Element 'xyz' has not become visible");
    
  • 您可以将 EC 设置为指向 protractor.ExpectedConditions 的全局可用变量。将此行添加到配置中的 onPrepare()

    onPrepare: function () {
        global.EC = protractor.ExpectedConditions;
    }
    
  • 作为自定义预期条件的示例,请参阅

在使用 Protractor 进行测试时非常重要的另一点是了解 ControlFlow。您可以在此处找到解释和代码示例:

让-马克

有两件事需要考虑。

首先,您应该正确地对所有量角器动作进行排序(@jmcollin92 也暗示了这一点)。为此,我通常在 每个 步骤上使用 .then

第二个重要的事情是确保新测试 it(...) 仅在前一个 it(...) 完成后才开始。

如果您使用最新版本的量角器,则可以使用 Jasmine 2.x 及其对测试完成信号的支持:

it('should do something', function(done) {
   clicksomething().then(function() {
     expect(...);
     done();
   });
});

此处调用了 done 参数以表示测试已准备就绪。如果没有这个,量角器将 安排 clicksomething 命令,然后立即继续下一个测试,仅在 clicksomething 完成后才返回当前测试。

由于通常两个测试都检查并可能修改相同的 browser/page,如果让它们同时发生,您的测试将变得不可预测(一个测试单击下一页,而另一个测试仍在检查上一页)。

如果您使用早期版本的 Protractor(如您所指的 1.3),Jasmine 1.3 runswaitsFor 函数可用于模拟此行为。

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

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

来禁用所有过渡动画