等待一个承诺或另一个承诺

时间:2017-02-02 15:52:23

标签: javascript selenium protractor

我正在测试一个有时会渲染一个小部件的页面,有时候会渲染另一个小部件。

我正在尝试使用browser.wait()来确保两个中的一个已经渲染,然后根据它的具体情况与相应的一个进行交互。

这是我的代码:

EC = protractor.ExpectedConditions

browser.wait(() => {
      return EC.presenceOf(userField) || EC.presenceOf(notMyAccountElement)
}, WAIT_TIME, 'Lock form (auth0) never appeared.')

notMyAccountElement.isPresent().then((result) => {
  if (result) {
    notMyAccountElement.click()
    browser.wait(EC.presenceOf(userField), WAIT_TIME, 'New lock form (auth0) never appeared.')
  }
  userField.sendKeys(user)
  passField.sendKeys(password)
  submitBtn.click()
})

这通常有效,但我在以下情况下会出现间歇性故障:

userField.sendKeys(user)

我可以在浏览器中看到,当该页面上实际存在notMyAccountElement时,该行会偶尔执行。

我认为最可能的问题是开场browser.wait()没有解决我期望的方式,但我想了解原因。

1 个答案:

答案 0 :(得分:4)

我认为您没有正确应用预期条件,您需要使用EC.or()

browser.wait(EC.or(EC.presenceOf(userField), EC.presenceOf(notMyAccountElement)), 
             WAIT_TIME, 'Lock form (auth0) never appeared.')

而且,由于您要与userField进行互动,因此您应该使用visibilityOfelementToBeClickable而不是presenceOf预期条件。虽然,我怀疑这与间歇性失败有关。

您还可以更改等待userField的状态/可见性到notMyAccountElement的隐身/陈旧性的等待。替换:

browser.wait(EC.presenceOf(userField), WAIT_TIME, 'New lock form (auth0) never appeared.');

使用:

browser.wait(EC.stalenessOf(notMyAccountElement), WAIT_TIME, 'New lock form (auth0) never appeared.');

或者,您可以逐个使用两者,以使事情更加可靠。