Проверка isDisplayed () атрибута WebElement в цикле while - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь написать цикл while, который проверяет атрибут isDisplayed() для загружаемого элемента и печатает «он загружается», если окно загрузки видно. Если окно загрузки исчезает, цикл while завершается.

private By superPoseLoading = By.xpath("//span[@class='loading']");

while (true) {

    if (driver.findElement(superPoseLoading).isDisplayed() == true) {
        System.out.println("is loading");

    }else {
        break;
    }
}

, но даже если условие if истинно, программа не отправляет сообщение, и цикл прерывается.

Ответы [ 3 ]

2 голосов
/ 07 ноября 2019

У меня немного другой подход, чем некоторые другие ответы - если ни один из них не работает для вас, не стесняйтесь попробовать это:

By loadingIndicator = By.xpath("//span[@class='loading']");
boolean loadingFinished = false;

while (!loadingFinished) 
{
    System.out.println("is loading");

    // attempt to find the loading indicator, catch exception if it is not found
    try {
        WebElement loader = driver.findElement(loadingIndicator);

        // check isDisplayed(), set found to true
        if (!loader.isDisplayed()) loadingFinished = true;

        // handle exception where loadmask no longer exists
    } catch (NoSuchElementException e) {
        loadingFinished = true;
        e.printStackTrace();
    }
}

Этот код проверяет наличиеloadmask и обрабатывает NoSuchElementException, который может возникнуть, если он не существует. Мы устанавливаем loadingFinished в true, если loader.isDisplayed() равно false или если при вызове findElement в загрузчике возвращается NoSuchElementException, то есть элемент не существует и загрузка завершена.

Однако, если вы хотите сделать этот код намного проще, вы можете просто использовать класс ExpectedConditions:

WebDriverWait wait = new WebDriverWait(driver, 30);

// first, wait for the loadmask to be visible to avoid race condition
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@class='loading']")));

// now, wait for load mask to disappear -- loading complete after this
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//span[@class='loading']")));
0 голосов
/ 07 ноября 2019

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

By superPoseLoadingLocator = By.xpath("//span[@class='loading']");
List<WebElement> waiter = driver.findElements(superPoseLoadingLocator);
while (!waiter.isEmpty() && waiter.get(0).isDisplayed()){
    System.out.println("Loading...");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
   waiter = driver.findElements(superPoseLoadingLocator);
}
// .. do the staff after the loading has been completed

Мне очень жаль, что здесь используется Thread.sleep(). Я просто показываю идею.

0 голосов
/ 07 ноября 2019

Вам не нужно выражение if и не нужно присваивать true методу .isDisplayed (), потому что он всегда возвращает логическое значение.

 while (driver.findElement(superPoseLoading).isDisplayed()) {
                System.out.println("is loading");
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...