Selenium webdriver WebDriver等待,直到找到此元素或该元素

Selenium webdriver WebDriver等待,直到找到此元素或该元素,selenium-webdriver,webdriver,protractor,Selenium Webdriver,Webdriver,Protractor,在其中一个应用程序工作流中,我有10多个页面需要导航 我必须不断点击“下一步”按钮——它会发出一个AJAX调用来重新加载新内容,“下一步”按钮也会被重新加载。 要导航的页数并不总是10页。它可能是10-100之间的任何值 只要找到id为“testcomplete”的webelement,我的测试就会完成 所以目前我使用ExpectedConditions() WebDriverWait wait=newwebdriverwait(驱动程序,30) 目前我的代码运行良好。但我正在努力改进它。我讨厌

在其中一个应用程序工作流中,我有10多个页面需要导航

我必须不断点击“下一步”按钮——它会发出一个AJAX调用来重新加载新内容,“下一步”按钮也会被重新加载。 要导航的页数并不总是10页。它可能是10-100之间的任何值

只要找到id为“testcomplete”的webelement,我的测试就会完成

所以目前我使用ExpectedConditions()

WebDriverWait wait=newwebdriverwait(驱动程序,30)

目前我的代码运行良好。但我正在努力改进它。我讨厌id为“testcomplete”的元素出现时不必要的等待30秒。因为此时“下一个按钮”将不存在

如何改进此
isNextPresent
功能?即,当出现“testcomplete”时立即返回false,而不是等待30秒?


注意:我也标记了量角器,因为我在量角器中也有类似的要求。

您可以结合这两个元素的条件,并根据第一个为“visibilityOf(myElement)”返回true的事实采取行动。在pseudo中可能会出现类似的情况(对不起,没有IDE):

循环(i<30){
//等待NextBtn 1秒,如果为真,单击并断开
//等待TestCopmlete 1秒钟
}

您可以将这两个元素的条件结合起来,并根据哪个元素首先为“visibilityOf(myElement)”返回true的事实来执行操作。在pseudo中可能会出现类似的情况(对不起,没有IDE):

循环(i<30){
//等待NextBtn 1秒,如果为真,单击并断开
//等待TestCopmlete 1秒钟
}
使用EC.or(),一个la:

然后在返回后,
expect
所需状态:

expect(NextButton.isDisplayed()).toBeTruthy();
使用EC.or(),a la:

然后在返回后,
expect
所需状态:

expect(NextButton.isDisplayed()).toBeTruthy();

“不必要的30秒等待”是什么意思?在
visibilityOf
返回true后,该函数不是立即执行,最大超时时间为30秒吗?@Gunderson,正如我提到的,它工作正常。但最终,在某一点上,“下一步”按钮将不存在。取而代之的是另一个名为testcomplete的元素。它等待了30秒。你说的“不必要的等待30秒”是什么意思?在
visibilityOf
返回true后,该函数不是立即执行,最大超时时间为30秒吗?@Gunderson,正如我提到的,它工作正常。但最终,在某一点上,“下一步”按钮将不存在。取而代之的是另一个名为testcomplete的元素。那次它等了30秒。现在我明白了。你的功能是做它应该做的。我想您应该使用另一个元素来轮询DOM中的其他元素。可能的解决方案是将两个检查都包装在一个循环中,并每隔一秒钟左右检查一次每个条件。是的,谢谢您的输入。我只是好奇是否有什么简单的方法可以做到这一点。我想我的问题与我现在看到的是重复的。你的功能是做它应该做的。我想您应该使用另一个元素来轮询DOM中的其他元素。可能的解决方案是将两个检查都包装在一个循环中,并每隔一秒钟左右检查一次每个条件。是的,谢谢您的输入。我只是好奇是否有什么简单的方法可以做到这一点。我想我的问题是重复的
wait.until(ExpectedConditions.or(
    ExpectedConditions.visibilityOf(NextButton),
    ExpectedConditions.visibilityOf(element(by.id('testcomplete')))
));
expect(NextButton.isDisplayed()).toBeTruthy();