Как ждать появления WebElement в DOM? - PullRequest
0 голосов
/ 18 февраля 2019

В настоящее время я ищу решение, чтобы дождаться появления определенного веб-элемента в DOM веб-сайтов.

В настоящее время я настроил приведенный ниже метод, который использует локатор By, однако вместо этого я собираюсь использовать WebElement, есть идеи?

Согласно JavaDocs:

public static ExpectedCondition visibilityOf (элемент WebElement): ожидание проверки того, что элемент, о котором известно, что он присутствует в DOM страницы, является видимым.Видимость означает, что элемент не только отображается, но и имеет высоту и ширину, превышающие 0.

Этот существующий выше метод проверяет, что элемент виден и также присутствует в DOM, но неприсутствует только в DOM.

Текущий метод, который использует By вместо WebElement: из чтения документации по селену видно, что можно подождать, пока элемент не будет виден в DOM;

Пример:

public static void waitForElementToAppearInDOM(By by, int timer) {
    try {
        WebDriver driver = getDriver();
        WebDriverWait exists = new WebDriverWait(driver, timer);
        exists.until(ExpectedConditions.presenceOfAllElementsLocatedBy(by));
    } catch(Exception e) {

    }
}

Ответы [ 6 ]

0 голосов
/ 19 февраля 2019

Вы были совершенно правы до public static ExpectedCondition visibilityOf (элемент WebElement): ожидание проверки того, что элемент, о котором известно, что он присутствует в DOM страницы, является видимым.Видимость означает, что элемент не только отображается, но также имеет высоту и ширину, превышающие 0. Этот существующий метод выше проверяет, что элемент видим и также присутствует в DOM, но не только присутствует в DOM .

Для простоты я бы перефразировал это ExpectedCondition как ожидание проверки наличия элемента, который, как известно, присутствует в DOM страницы, .

Of-coarseдва ожидания presenceOfElementLocated() и visibilityOf() имеют много различий между ними.


Возвращаясь к вашему основному вопросу, для ожидания присутствия определенного WebElement , используя WebElement в качестве аргумента невозможно .Причина проста, поскольку WebElement еще предстоит идентифицировать в DOM, который будет идентифицирован только после ожидаемого успеха presenceOfElementLocated или findElement().

Эта концепция внезапноподдерживается списком ExpectedCondition s в JavaDocs , относящихся к наличию элемента (ов) , которые следующие:


В заключение нельзя передать WebElement в качестве аргументав качестве ожидания presenceOfElementLocated(), а WebElement еще предстоит определить.Но как только элемент идентифицирован с помощью findElement() или presenceOfElementLocated(), этому WebElement может быть передан аргумент.

Подводя итог:

  • presenceOfElementLocated(By locator): Это ожидание для проверки того, что элемент присутствует в DOM страницы.Это не обязательно означает, что элемент является видимым .

  • visibilityOf(WebElement element): это ожидание для проверки того, что элемент, известныйприсутствовать на DOM страницы, видно.Видимость означает, что элемент не только отображается , но также имеет height и width , что на больше 0 .

0 голосов
/ 19 февраля 2019

Как проверить наличие с WebElement в качестве параметра.

    public boolean isElementPresent(WebElement element) {
        if (element != null) {
            try {
//this line checks the visibility but it's not returned. 
//It's to perform any operation on the WebElement
                element.isDisplayed(); 
                return true;
            } catch (NoSuchElementException e) {
                return false;
            } 
        } else return false;
    }
0 голосов
/ 18 февраля 2019

Этот метод "visibilityOfElementLocated" использует By:

Пример: // Ожидание видимого элемента

WebDriverWait wait = new WebDriverWait(driver, 15);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@id='text3']")));
0 голосов
/ 18 февраля 2019

Несколько проблем:

  1. Присутствие означает, что оно существует в DOM, но не обязательно видимое, активируемое щелчком мыши и т. Д. Если вы хотите, чтобы элемент был видимым, дождитесь его видимого.
  2. Вы используете *Elements* во множественном числе, которое будет ожидать ALL элементов, найденных локатором, а не только того, который вы конкретно ищете.Это может привести к сбивающим с толку сбоям и т. Д., Если у вас нет уникального локатора.Я бы не использовал множественное число, если вы хотите использовать только единственное число.
  3. Вам следует внимательно прочитать документы .Существует метод ExpectedConditions, который делает именно то, что вы ищете.

public static ExpectedCondition visibilityOf (элемент WebElement)

Ваш код должен выглядеть болеекак

public static void waitForElementToAppearInDOM(WebElement element, int timer) {
    try {
        new WebDriverWait(getDriver(), timer).until(ExpectedConditions.visibilityOf(element));
    } catch(Exception e) {
        // don't leave an empty catch, do something with it or don't catch it.
    }
}
0 голосов
/ 18 февраля 2019

В вашем коде у вас должен быть идентификатор или xpath в качестве локатора.Посмотрите на документы по ExpectedConditions Строка 5 будет выглядеть следующим образом:

exists.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By, locator));

Также посмотрите на это наличие элемента, не совпадающего с видимостью .

0 голосов
/ 18 февраля 2019

Может быть, вы можете попробовать вот так:

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...