0

我遇到了一个问题,我想创建一个函数,等待列表中存在文本“其他”。我希望它等待 30 秒,并且每 5 秒它会再次调用并验证新列表。(最多 5 - 6 次验证文本是否存在于新列表中)。我已经通过将列表转换为地图并检查任何匹配来完成验证(地图转换和检查正在工作)。

问题在于等待机制,我尝试创建复杂的流畅等待,如果找到预期的文本,它也会接收布尔值,然后等待应该停止。但是,如果在第一次或第二次尝试中找不到文本,我不知道要返回什么,我希望它仍然等待并再次拨打电话并再次验证。

  • 我希望仅在两种情况下停止等待:

    • “其他”一词存在 - 在这种情况下 isExists 为真。
    • 时间超过30秒。拉动间隔5秒,不显示“其他”字样

有没有办法在等待条件中设置等待 Boolean == true ?我不确定条件 Boolean>() 是否正确,可以在 wait.until 中完成,如果它可以工作

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 ******
    }

});
}
4

2 回答 2

0

做完你的建议后返回 false 解决了

于 2019-10-13T09:19:41.643 回答
0

您可以这样简化您的代码 - 使用FluentWait您声明的。您可以仅用这一行替换wait.until(new Function<WebDriver , Boolean>()包含该函数的整个块。apply与其调用映射来获取所有li元素的文本并检查其他文本,不如编写函数以li使用 text直接查找Other

fluentWait.until
    (ExpectedConditions.presenceOfElement(By.xpath("//ul[contains(@class, 'ant-select-dropdown-menu')]/li[text()='Other'])));

此代码将等到li包含文本Other出现。

于 2019-10-05T13:55:58.570 回答