量角器:单击按钮后如何等待页面完成?

Zac*_*ach 74 wait jasmine protractor

在测试规范中,我需要单击网页上的按钮,然后等待新页面完全加载.

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click();

// ...Here need to wait for page complete... How?

ptor.waitForAngular();
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
Run Code Online (Sandbox Code Playgroud)

gle*_*tre 85

根据您的要求,您可以尝试:

browser.waitForAngular();

要么

btnLoginEl.click().then(function() {
  // do some stuff 
}); 
Run Code Online (Sandbox Code Playgroud)

解决诺言.如果你能做到这一点会更好beforeEach.

注意:我注意到expect()在比较之前等待内部的promise(即getCurrentUrl)被解决.

  • 这并没有解决我在点击按钮后等待javascript完成修改页面的问题.按照建议[下面](/sf/answers/1928571011/)添加`browser.driver.sleep(1000)`就可以了. (3认同)
  • `waitForAngular()` [不应使用](/sf/ask/2161787001/)。关于 `click().then()` 它对我不起作用。我只能依靠`browser.wait(//use of protractor.ExpectedConditions)`。 (3认同)

Fil*_*zak 29

我只是看了一下源代码 - Protractor只在少数情况下等待Angular(比如element.all调用时,或设置/获取位置).

所以Protractor不会等待Angular在每个命令后稳定下来.

此外,有时在我的测试中,我在Angular摘要周期和点击事件之间进行了比赛,所以有时我必须这样做:

elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();
Run Code Online (Sandbox Code Playgroud)

使用sleep等待执行进入AngularJS上下文(由click事件触发).

  • 我不建议使用显式睡眠,因为即使应用程序加载的速度超过配置的睡眠速度,您也会睡眠. (3认同)

And*_*s D 25

你不需要等待.量角器自动等待角度准备就绪,然后执行控制流程中的下一步.

  • 它会自动等待吗?看一下像`browser.get`这样的东西,它明确地说它存在覆盖它包装的东西.如果`ElementFinder`没有`click`方法,那么它似乎只是委托给`webDriver.WebElement`.https://angular.github.io/protractor/#/api?view=ElementFinder (8认同)
  • 如果我们不需要等待,则此线程将不会被查看100,000次. (8认同)
  • 理论上是的,因为`waitForAngular()`是在内部调用的,但是我也不得不称之为一些规格. (5认同)
  • @Snekse Protractor同步了ElementFinder和ElementArrayFinder上的所有操作.因此,每当您的测试尝试查找任何元素时,查找本身将等待angular来完成消化周期,然后将调用委托给webdriver.expect()调用也是如此. (5认同)

小智 6

使用量角器,可以使用以下方法

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain newPageName
browser.wait(EC.urlContains('newPageName'), 10000);
Run Code Online (Sandbox Code Playgroud)

所以您的代码看起来像

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click();

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain efg
ptor.wait(EC.urlContains('efg'), 10000);

expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
Run Code Online (Sandbox Code Playgroud)

注意:这可能并不意味着新页面已完成加载并且DOM已准备就绪。随后的'expect()'语句将确保Protractor等待DOM可用于测试。

参考:量角器的预期条件