为什么需要使用waitForAngular(false)和browser.sleep(3000)?

时间:2019-09-27 15:02:43

标签: angularjs testing protractor automated-tests end-to-end

我们有一个网站是由Angular 100%构建的,我被要求使用Protractor编写端到端测试。现在遇到一个问题,如果我不使用waitForAngular(false)browser.sleep(3000),那么即使使用ExpectedCondition,我的测试也会失败。

这是我的场景:

在登录页面中,我可以找到所有元素,将键发送到输入框并登录。但是登录后失败。它找不到任何元素,请完全单击任何元素。

我的代码如下。

describe("/profile", () => {
  let page: Profile;

  beforeAll(async () => {
    page = await login(Profile, user, login);
    await browser.wait(ExpectedConditions.presenceOf(page.element));
    await navigate(path.profile)
  })

  afterAll(async () => {
    logout();
  })

  it("should have navigate to the page", async () => {
    expect(await browser.getCurrentUrl()).toContain("/profile");
  });

  it("should have correct page markup", async () => { 
// this test fails without waitForAngular(false)
// or browser.sleep(3000) in the navigation or OnPrepare in the config
    expect(await page.headerTitle.isDisplayed()).toBe(true);
    expect(await page.headerTitle.getText()).toContain("Profile")
  })
})

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

据我从评论中还可以理解,在您的应用程序(应使用量角器进行测试)上,您有setIntervalsetTimeout或长时间运行且反复执行的异步操作。

在量角器执行任何测试规范之前,它将尝试等待Angular 2应用程序“同步”,即完成所有出色的操作。默认情况下,量角器将超时设置为11秒。

由于您执行一些“无限”操作-同步失败,并且量角器因超时错误而停止执行。

您可以使用Zone.js来避免这种情况:

ngZone.runOutsideAngular(() => {
    setInterval(() => {
        ngZone.run(() => {
            // async operation
        });
    }, 2500);

与您的开发人员一起调查这个问题。

来源:https://christianliebel.com/2016/11/angular-2-protractor-timeout-heres-fix/

答案 1 :(得分:0)

首先,browser.wait()具有三个参数-函数条件,超时,失败消息。仅最后一个是可选的。您忘记指定超时时间(以毫秒为单位),可能会导致问题

第二,waitForAngular将可选字符串作为描述。知道为什么您将false传递给它

P.S。 我认为您误解了有关如何处理量角器中等待的主要概念

browser.sleep(ms)-是显式等待,在指定为参数的毫秒数内停止执行

browser.wait()-等待,直到传递给它的函数返回true,或等待作为参数传递的毫秒数。这不是明确的等待。另外,它不会无限期地等待。您将超时时间作为参数传递,或者从protractor.conf.js中花费jasmineNodeOpts.defaultTimeoutInterval或默认30秒

您的browser.sleep(ms)导致测试性能出现问题。在测试中避免使用

browser.waitForAngular()-非常有用,它会等到您的角度应用程序完成所有幕后任务,但默认情况下它包含在每个动作中。因此,如果您使用2、3或4次,通常不会有任何影响。重要提示,某些应用程序的构建不正确,并且总是在后台加载某些内容,因此您的测试要么很慢,要么根本没有响应。这就是为什么我总是使用browser.waitForAngularEnabled(false)运行测试的原因,但是等待非常困难。作为一项优势,您可以获得快速,可靠的测试。而且不要将false传递给waitForAngular,它没有任何作用。

话虽如此,忘了browser.sleep(),而是学习如何使用browser.wait

如果您使用的是browser.sleep(3000),则会使测试停止3秒钟,但是如果下一个元素准备在500毫秒内与之交互,该怎么办?所以只要说等到元素存在(可见(难处理(或您想要的任何))),但不超过3秒,您就可以进行更快的测试

希望能回答您的问题