Свободное ожидание в селене с нестандартным условием - хром - PullRequest
0 голосов
/ 05 октября 2019

У меня проблема, с которой я сталкиваюсь, я хочу создать функцию, которая ждет, пока в списке не появится текст «Другое». Я хочу, чтобы он подождал 30 секунд, и каждые 5 секунд он будет повторять вызов и проверять новый список. (Максимум 5 - 6 раз для проверки, если текст существует в новом списке). Я сделал проверку путем преобразования Списка в карту и проверил любое совпадение (преобразование карты и проверка работает).

Проблема в механизме ожидания, я пытаюсь создать сложное свободное ожидание, которое такжеполучить логическое значение в случае обнаружения ожидаемого текста, а затем ожидание должно прекратиться. Но я не понимаю, что возвращать, если не найден текст, например, в первой или второй попытке, и я хочу, чтобы он все еще ждал, сделал вызов снова и подтвердил снова.

  • Я хочу, чтобы ожидание остановилось только в двух случаях:

    • существует слово "Другое" - в этом случае isExists имеет значение true.
    • время проходит больше, чем30 секунд. С интервалом вытягивания 5 секунд и словом «прочее» не отображается

Есть ли способ установить условие ожидания для логического ожидания ==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 ******
    }

});
}

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

После выполнения ваших предложений верните false, решите это

0 голосов
/ 05 октября 2019

Вы можете упростить свой код как таковой - используя объявленный вами FluentWait. Вы можете заменить весь блок wait.until(new Function<WebDriver , Boolean>(), содержащий функцию apply, только этой строкой. Вместо того, чтобы вызывать отображение для получения текста для всех элементов li и проверки текста на другие, вы можете написать свою функцию для непосредственного поиска li с текстом Other:

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

Этот кодбудет ждать, пока не появится li содержащий текст Other.

...