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...)