Селен: Проверьте наличие элемента - PullRequest
0 голосов
/ 30 мая 2018

При автоматизации в реальном времени проверяем ли мы наличие каждого элемента (в тесте), прежде чем выполнять над ним какие-либо действия?

Везде, где есть оператор findElement, есть вероятность NoSuchElementException .Мой вопрос заключается в том, проверяем ли мы наличие элемента каждый раз?

Должен ли каждый оператор findElement быть окружен блоком try-catch?

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

Позвольте мне попытаться ответить на ваши вопросы один за другим:

  • In real-time automation, do we check for the presence of every element(in test) before performing some action on them: Да в соответствии с рекомендациями, когда пользователь перенаправляется на новую страницу, которую вы должны обеспечить состояние элемента в соответствии с вашим желаемым действием.

Существует 3 наиболее широко используемых Ожидаемые условия , которые можно использовать вместе с WebDriverWait дляпроверить состояние элемента следующим образом:

senceOfElementLocated

senceOfElementLocated (По локатору) определяется следующим образом:

public static ExpectedCondition<WebElement> presenceOfElementLocated(By locator)

Description : An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible.

visibilityOfElementLocated

visibilityOfElementLocated (По локатору) определяется следующим образом:

public static ExpectedCondition<WebElement> visibilityOfElementLocated(By locator)

Description : An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.

elementToBeClickable

elementToBeClickable (По локатору) определяется следующим образом:

public static ExpectedCondition<WebElement> elementToBeClickable(By locator)

Description : An expectation for checking an element is visible and enabled such that you can click it.
  • Wherever there is a findElement statement, there is a chance of NoSuchElementException: Нет , совсем нет.Если вы создадите правильную стратегию локатора , вы не столкнетесь с NoSuchElementException.

    Здесь вы найдете подробное обсуждение NoSuchElementExeption, селен не может обнаружить элемент

  • Does every findElement statement need to be surrounded by try-catch block: Нет , не всегда.Если ваш сценарий использования включает в себя обработку как положительных , так и отрицательных сценариев, тогда блок try-catch {} идеально подходит.

0 голосов
/ 30 мая 2018

Есть два случая для учета:

  1. Является ли элемент присутствует ;смысл существует ли он в DOM.
  2. Является ли элемент видимым ;это означает, что он находится в DOM и не имеет скрытого или эквивалентного флага.

Для первого случая я использую следующий вспомогательный метод:

this.waitForElement = function(locator) {
    browser.wait(function() {
      return browser.isElementPresent(locator);
    }, testData.Timeout.TWO_MINUTES);
};

Это будет ждать произвольное количество времени, пока элемент, соответствующий предоставленному локатору, станет присутствующим (он существует в DOM).

Во втором случае я использую этот вспомогательный метод:

this.waitForElementIsVisible = function(el){
    let EC = protractor.ExpectedConditions;
    browser.wait(EC.visibilityOf(el), testData.Timeout.TWO_MINUTES, "Element did not become visible after 2 minutes");
};

Это принимает WebElement в качестве единственного параметра и ждет, пока элемент не станет видимым (Он существует в DOM и не скрыт с помощью стиля CSS или чего-то еще)

В качестве бонуса я также обнаружил, что этот вспомогательный метод полезен для тестирования состояний ошибок в форме:

this.waitForElementIsClickable = function(el){
    let EC = protractor.ExpectedConditions;
    browser.wait(EC.elementToBeClickable(el), testData.Timeout.TWO_MINUTES, "Element did not become clickable after 2 minutes");
};

Принимает WebElement в качестве первого параметра и ждет, пока этот WebElement можно будет щелкнуть.

Обратите внимание, я использую транспортир, и ссылочный транспортир в этих фрагментах.Поэтому, если вы не используете Protractor, скорее всего, они не будут работать на 100% через прямое копирование + вставка.Хотя их должно быть достаточно легко настроить, чтобы они соответствовали вашим настройкам.

0 голосов
/ 31 мая 2018

Вы можете использовать класс AbstractWebDriverEventListener особенно полезным.Этот класс реализует интерфейс WebDriverEventListener , который определяет before и after перехватчики для событий, запускаемых WebDriver.

Один такой перехватчик до beforeFindBy может быть реализован дляпроверить наличие элемента.Например:

public void beforeFindBy(By by, WebElement element, WebDriver driver) {
    // Explicit wait to check for the presence of the element using the "by" locator
}

Аналогичным образом можно реализовать ловушку before beforeClickOn для проверки возможности нажатия на элемент перед выполнением события click для этого элемента.

0 голосов
/ 30 мая 2018

Самый прямой и простой способ проверить наличие веб-элемента - использовать findElements () (обратите внимание на множественное число), который возвращает массив, т.е.

if (driver.findElements(By.xpath("//a")).isEmpty())
    // no links exist

Можно использовать тот же методчтобы проверить наличие одного элемента, он не должен быть массивом.Возвращенное значение .size () с нулем означает, что совпадений не было, и, следовательно, искомый элемент отсутствует в DOM.

Лучший метод, как утверждают некоторые, состоит в том, чтобы обернуть элемент .findElement в метод, который выполняетпопробуйте / поймать и регистрировать / отвечать соответственно различным результатам, таким как элемент не найден, или устаревший элемент и т. д.

Я использую оба метода в своих тестах и ​​использую собственную функцию существующие с логикой .findElements, ноиспользуйте обертку для других сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...