2017-02-02 92 views
2

我正在测试一个页面,有时会呈现一个小部件,有时会呈现另一个小部件。等待一个承诺或另一个

我试图使用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()不能解决我期待的方式,但我想明白为什么。

回答

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.'); 

或者,您可以通过一个使用这两个,一个,使事情更可靠。

+0

Thanks @alecxe!我会试一试'EC.or()',如果它解决了我的问题,请回复。 –

+0

我已经连续使用'EC.or()'运行了两个小时,没有发生任何故障。这似乎已经成功了。再次感谢! –