Pull to refresh

Selenide: удобные тесты на Selenium WebDriver

Reading time 3 min
Views 84K
Многие слышали про Selenium WebDriver — один из самых популярных инструментов для написания приёмочных/интеграционных тестов.


Используя Selenium, мы очень быстро заметили, что нам раз от раза приходится писать один и тот же код, чтобы инициализировать браузер вначале, закрыть его в конце, делать скриншоты после каждого упавшего теста и т.д. (пруфлинк).

Поэтому мы решили выделить этот повторяющийся код в отдельную библиотеку. Так на свет появился Selenide.


Что такое Selenide


Selenide — это обёртка вокруг Selenium WebDriver, позволяющая быстро и просто его использовать при написании тестов, сосредоточившись на логике, а не суете с браузером.

Вот пример теста. Как видите, код минимален. Вызвал «open» — и браузер открылся.

@Test
public void testLogin() {
  open("/login");
  $(By.name("user.name")).sendKeys("johny");
  $("#submitButton").click();
  waitUntil(By.id("username"), hasText("Hello, Johny!"));
  $("#username").shouldHave(cssClass("green-text"));

  assertThat($("#insuranceDetailsHeader").getText(), equalTo("Страховые полисы"));
  assertThat($$("#paymentScheduleTable tr").size(), equalTo(7));
}


При вызове метода open Selenide сам запускает браузер и открывает страницу localhost:8080/login (порт и хост конфигурируется, естественно). А также заботится о том, чтобы в конце браузер закрылся.

Дополнительные вкусности Selenide


Selenide предоставляет дополнительные методы для действий, которые невозможно сделать одной командой Selenium WebDriver. Это выбор радио-кнопки, выбор элемента из выпадающего списка, создание снимка экрана, очистка кэша браузера и т.п.

@Test
public void canFillComplexForm() {
  open("/client/registration");
  setValue(By.name("user.name"), "johny");
  selectRadio("user.gender", "male");
  selectOption(By.name("user.preferredLayout"), "plain");
  selectOptionByText(By.name("user.securityQuestion"), "What is my first car?");
  followLink(By.id("submit"));
  takeScreenShot("complex-form.png");
}

@Before
public void clearCache() {
  clearBrowserCache();
}


И особняком стоит вопрос Ajax: при тестировании приложений, использующих Ajax, приходится изобретать код, который чего-то ждёт (когда кнопка станет зелёной). Selenide предоставляет богатый API для ожидания наступления различных событий:
@Test
public void pageUsingAjax() {
  waitFor("#username");
  waitUntil("#username", hasText("Hello, Johny!"));
  waitUntil("#username", hasAttribute("name", "user.name"));
  waitUntil("#username", hasClass("green-button"));
  waitUntil("#username", hasValue("Carlson"));
  waitUntil("#username", appears);
  waitUntil("#username", disappears);
}


Я хочу попробовать, с чего начать?


1. Добавь в свой проект зависимость Selenide:
<dependency>
    <groupId>com.codeborne</groupId>
    <artifactId>selenide</artifactId>
    <version>1.6</version>
</dependency>


2. Импортируй парочку классов:
include static com.codeborne.selenide.Navigation.*
include static com.codeborne.selenide.DOM.*

Готово! Пиши тесты, едрён-батон!

Кто-нибудь это реально использует?


Да, мы в нашей фирме используем Selenide в нескольких реальных проектах:
  • Java + ANT + JUnit
  • Java + Gradle + JUnit
  • Scala + ANT + ScalaTest


Так что можете быть уверены, проект не сырой, реально используется и поддерживается.
Есть ещё небольшой эталонный open-source проект, в котором используется Selenide: игра Виселица.

Откуда такое название — Selenide?


Библиотека Selenium взяла своё название от химического элемента (Селен). А селениды — это соединения селена с другими элементами.

Вот и у нас:
  • Selenide = Selenium + JUnit
  • Selenide = Selenium + TestNG
  • Selenide = Selenium + ScalaTest
  • Selenide = Selenium + что угодно


Химичьте на здоровье!

UPD. В марте 2013 выпущена версия Selenide 2.0, в которой сильно обновился API. Теперь использование Selenide ещё проще и удобнее.

И ещё мы запустили сайт на русском языке: ru.selenide.org

Tags:
Hubs:
+15
Comments 33
Comments Comments 33

Articles