我有一个我面临的问题,我想创建一个函数,该函数一直等到文本"其他"存在于列表中。 我希望它等待 30 秒,每 5 秒它将再次调用并验证新列表。 (最多 5 - 6 次以验证新列表中是否存在文本(。 我已经通过将列表转换为地图并检查任何匹配项(地图转换和检查正常工作(来完成验证。
问题出在等待机制上,我尝试创建复杂的流畅等待,在找到预期文本的情况下,它也会收到布尔值,然后等待应该停止。但是,例如在第一次或第二次尝试中找不到文本,我不知道要返回什么,我希望它仍然等待并再次调用并再次验证。
-
我希望仅在两种情况下停止等待:
- "其他"一词存在 - 在这种情况下是存在是真的。
- 时间超过30秒,拉动间隔为5秒,不显示"其他"字样
有没有办法设置等待布尔值 == true 的条件?我不确定条件 Boolean>(( 是否正确,可以在等待中完成,以及它是否会起作用
public void testrIntegrationfluent ()
{
WebElement element = BasePage.getWebElementByXPathWithWaitToClicable("//nz-select[@formcontrolname='selectedIntegrationTypes']/div");
element.click();
WebDriver driver2 = WebDriverMgr.getDriver();
Wait wait = new FluentWait(driver2)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
wait.until(new Function<WebDriver , Boolean>() {
public Boolean apply (WebDriver driver2) {
List<WebElement> dropdownOptions = driver2.findElements(By.xpath("//ul[contains(@class, 'ant-select-dropdown-menu')]/li"));
Boolean isExists = dropdownOptions.stream().map(WebElement::getText).anyMatch(text -> "Other".equals(text));
if (isExists.equals(true)) {
return isExists;
}
return ****** need to think what to put thatkeep waiting and perform call for list and validation reoccured ******
}
});
}
你可以这样简化你的代码——使用你声明的FluentWait
。您可以将包含apply
函数的整个wait.until(new Function<WebDriver , Boolean>()
块替换为此行。与其调用映射来获取所有li
元素的文本并检查其他文本,不如编写函数以直接查找带有文本Other
的li
:
fluentWait.until
(ExpectedConditions.presenceOfElement(By.xpath("//ul[contains(@class, 'ant-select-dropdown-menu')]/li[text()='Other'])));
此代码将等到包含文本Other
li
存在。
做完你的建议之后 返回错误解决了它