com.codeborne.selenide.SelenideElement [src]

Класс SelenideElement - обёртка вокруг Selenium WebElement, которая добавляет несколько весьма полезных методов.

Cам объект SelenideElement, который возвращается методом $ - является прокси-элементом. В момент создания с помощью $ реальный элемент на странице не ищется. Зато потом при любой попытке совершить с прокси-элементом какое-то действие или проверку - прокси-элемент получает последнюю актуальную "версию" реального элемента со страницы (типа WebElement) и "проксирует" ей указанное действие или проверку.

Во-первых, это позволяет с помощью Selenide эффективно автоматизировать тестирование современных динамических веб приложений.

Во-вторых, с помощью таких прокси-элементов, можно конструировать объекты страниц в соответствии с шаблоном PageObject. За счет того, что элемент не ищется сразу в момент создания обьекта SelenideElement, мы можем сохранить его в поле обьекта PageObject еще до открытия страници:

//до открытия браузера и загрузки страницы
class HomePage {
  private SelenideElement menu = $("#menu");

  public void openStream() {
      this.menu.find(byLinkText("Stream")).click();
  }

  public void openProfile() {
      this.menu.find(byLinkText("Profile")).click();
  }
}
HomePage home = new HomePage();
//теперь команда $ уже была вызвана и был создан SelenideElement, а даже браузер еще не октрыт
//...
open("/home"); //открылся браузер и была загружена страница
home.openProfile(); // только теперь была получена актуальная версия элемента-меню со страницы, в ней внутри был найден элемент-ссылка с текстом Stream, и ему была "проксирована" команда click()
//...много чего могло произойти
home.openStream(); //и тепеь перед нахождением элемента-ссылки с текстом Profile для того, что-бы совершить на нем click() - снова была получена актуальная версия элемента-меню на странице
//...

Для SelenideElement определенны методы следующего типа:

  • методы поиска внутренних элементов
    • а точнее методы создания прокси-элементов представляющих элементы внутри данного
  • методы-проверки состояния элемента - assertions
  • методы-действия над элементом
  • методы получения статусов элементов и значений их атрибутов
  • другие

Все они имеют дополнительные встроенные особенности для их более удобного использования. Большинство из них имеют встроенные неявные ожидания. Это позволяет просто работать с динамически загружаемыми элементами не опускаясь до уровня техничских деталей настройки дополнительных явных ожиданий.

Методы поиска внутренних элементов

  • find(String cssSelector) | $(String cssSelector)
  • find(By) | $(By)
  • findAll(String cssSelector) | $$(String cssSelector)
  • findAll(By) | $$(By)

Здесь $ и $$ просто лаконичные "алиасы" (синонимы) для соответствующих команд.

Все эти методы возвращают "прокси-элементы", то есть не ищут реальные элементы до тех пор пока не будет вызвано какое то действие над элементом (например .click())

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

$("#header").find("#menu").findAll(".item")

И при этом можно сохранить "цепочку поиска" любой длины в переменную, независимо от того, загружена ли страница на момент инициализации переменной, или даже открыт ли браузер, например:

//до открытия браузера и загрузки страницы
SelenideElement menu = $("#menu");
SelenideElement streamMenu = menu.$(By.linkText("Stream"));
SelenideElement profileMenu = menu.$(By.linkText("Profile"));
//...
open("/main");
profileMenu.click();
//...
streamMenu.click();
//...

Методы-проверки состояния элемента - assertions

Методы-проверки - assertions - инициируют для прокси-элемента поиск актуальной версии элемента на странице, совершают проверку по предикату ("условию" - объекту-кондишену класса Condition), и возвращают объекты SelenideElement, позволяя использовать цепочки вызовов.

  • should(Condition) | shouldBe(Condition) | shouldHave(Condition)
  • shouldNot(Condition) | shouldNotBe(Condition) | shouldNotHave(Condition)

Рекомендуется выбирать такой метод, чтобы строка кода легко воспринималась, как обычная фраза, e.g. :

$("input").should(exist);  
$("input").shouldBe(visible);
$("input").shouldHave(exactText("Some text"));

Проверки играют роль явных ожиданий (explicit waits) в Selenide. Они ждут до удовлетворения условия (visible, enabled, text("some text")) пока не истечет таймаут (значение Configuration.timeout, которое установлено по умолчанию в 4000 миллисекунд).

Можно использовать проверки явно - с целью ожиданий нужного состояния у элементов перед действием, e.g. $("#submit").shouldBe(enabled).click();

Есть версии явных ожиданий с указанием таймаута:

  • waitUntil(Condition, milliseconds)
  • waitWhile(Condition, milliseconds)

Методы-действия над элементом

Действия над элементами

  • click()
  • doubleClick()
  • contextClick()
  • hover()
  • setValue(String) | val(String)
  • pressEnter()
  • pressEscape()
  • pressTab()
  • selectRadio(String value)
  • selectOption(String)
  • append(String)
  • dragAndDropTo(String)
  • ...

инициируют для прокси-элемента поиск актуальной версии элемента на странице, и совершают соответствующее действие.

Действия имеют встроенные неявные ожидания (implicit waits) до видимости элемента пока не истечет таймаут (значение Configuration.timeout, которое установлено по умолчанию в 4000 миллисекунд).

Следовательно код $("#submit").shouldBe(visible).click() избыточен и будет достаточно $("#submit").click().

Большинство действий также возвращают обьект SelenideElement, позволяя использовать цепочки вызовов, e.g. $("#edit").setValue("text").pressEnter();.

Методы получения статусов элементов и значений их атрибутов

Инициируют для прокси-элемента поиск актуальной версии элемента на странице и имеют разную логику неявных ожиданий в зависимости от контекста:

  • Выполняется ожидание до появления элемента в DOM:

    • getValue() | val()
    • data()
    • attr(String)
    • text() // возвращает "видимый текст на странице"
    • innerText() // возвращает "текст элемента в DOM"
    • getSelectedOption()
    • getSelectedText()
    • getSelectedValue()
  • Нет ожидания :

    • isDisplayed() //возвращает false, если элемент либо невидимый, либо его нет в DOM
    • exists() //возвращает true, если элемент есть в DOM, иначе - false

Другие полезные команды

  • uploadFromClasspath(String fileName)
  • download()
  • toWebElement()
  • uploadFile(File...)

results matching ""

    No results matching ""