Quantcast
Channel: Selenide
Viewing all articles
Browse latest Browse all 47

Что такое Selenide

$
0
0

Многие слышали про Selenium WebDriver - один из самых популярных инструментов для написания приёмочных/интеграционных тестов.

Написание UI тестов - непростая задача. Есть ряд проблем, с которыми сталкиваются все без исключения - это Ajax-запросы, динамические страницы и, чёрт их подери, таймауты. Главная цель Selenide - решить эти проблемы.

right

Что такое Selenide

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

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

@TestpublicvoidtestLogin(){open("/login");$(By.name("user.name")).sendKeys("johny");$("#submitButton").click();$("#username").shouldHave(text("Hello, Johny!"));$(".error").shouldNotBe(visible);}

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

Ключевые особенности Selenide

Если вкратце, вот главные особенности Selenide

  • Лаконичный синтаксис в духе jQuery
  • Автоматическое решение большинства проблем с Ajax, ожиданием и таймаутами.
  • Управление жизнедеятельностью браузера
  • Автоматическое создание скриншотов

Одним словом, цель Selenide - сосредоточиться на бизнес-логике и не заниматься вечными надоедливыми мелкими проблемами.

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

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

@TestpublicvoidcanFillComplexForm(){open("/client/registration");$(By.name("user.name")).setValue("johny");selectRadio("user.gender","male");$(By.name("user.securityQuestion")).selectOption("What is my first car?");$(By.name("user.preferredLayout")).selectOptionByValue("plain");$("#submit").followLink();takeScreenShot("complex-form.png");}@BeforepublicvoidclearCache(){clearBrowserCache();}

Как побороть Ajax?

Ajax - это засада для UI тестировщиков. При тестировании приложений, использующих Ajax, приходится изобретать код, который чего-то ждёт (когда кнопка станет зелёной). Selenide решает эту проблему как никто другой. В то время как Selenium предлагает богатый API для ожидания разного рода событий Например, Selenide просто предлагает вам не заморачиваться. Если вы хотите поверить, что кнопка зелёная, а она пока что не зелёная, Selenide просто подождёт, пока она станет зелёной. Конечно, таймаут конфигурируется (по умолчанию 4 секунды). Это уникальное решение - простое и надёжное.

@TestpublicvoidpageUsingAjax(){$("#username").shouldBe(visible);// ждёт, пока элемент появится$("#username").shouldHave(text("Hello, Johny!"));// ждёт, пока текст элемента изменится на "Hello, Johny!"$("#login-button").shouldHave(cssClass("green-button"));// ждёт, пока кнопка станет зелёной$("#login-button").shouldBe(disabled);// ждёт, пока кнопка станет неактивной$(".error").shouldNotBe(visible);// ждёт, пока элемент исчезнет$(".error").should(disappear);// попробуйте-ка сделать это с Selenium в одну строчку!}

Как автоматически делать скриншоты?

Легко! Если вы используете JUnit, просто добавьте эту строчку в свой тестовый класс:

@RulepublicScreenShootermakeScreenshotOnFailure=ScreenShooter.failedTests();

Тогда после каждого упавшего теста будет автоматически создаваться скриншот (на самом деле два файла, .PNG и .HTML).

А если вы хотите снимать вообще все тесты, а не только упавшие, тогда подойдёт такая строчка:

@RulepublicScreenShootermakeScreenshotOnEveryTest=ScreenShooter.failedTests().succeededTests();

Если вы используете TestNG, просто добавьте следующую аннотацию к своему тестовому классу:

@Listeners({ScreenShooter.class})

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

Добавь в свой проект зависимость Selenide:

<dependency><groupId>com.codeborne</groupId><artifactId>selenide</artifactId><version>3.5.1</version></dependency>

Импортируй нужный класс:

importstaticcom.codeborne.selenide.Selenide.*

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

Зачем ещё один велосипед?

Нам приходилось использовать Selenium в разных проектах, и мы быстро заметили, что нам раз от раза приходится писать один и тот же код, чтобы инициализировать браузер в начале, закрыть его в конце, делать скриншоты после каждого упавшего теста и т.д. В интернете можно найти множество статей типа “Как в Selenium сделать то или это” с кучей кода, который приходится копировать к себе в проект. Например.

И мы подумали: почему создание UI-тестов должно быть таким сложным? Поэтому мы решили выделить этот повторяющийся код в отдельную библиотеку. Так на свет появился Selenide.

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

Да, мы в фирме Codeborneиспользуем Selenide в нескольких реальных проектах:

  • Интернет-банки
  • Порталы самообслуживания
  • и т.д.

с разными языками и тестовыми фреймворками: * Java + ANT + JUnit * Java + Gradle + JUnit * Scala + ANT + ScalaTest * Groovy + ANT * и т.д.

Так что можете быть уверены, проект не сырой, реально используется и поддерживается.

Покажите мне работающий пример!

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

А также мы создали проект Selenide examples, где мы храним примеры использования Selenide для тестирования Gmail, Githubи других классических примеров.

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

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

Вот и у нас:

  • Selenide = Selenium + JUnit
  • Selenide = Selenium + TestNG
  • Selenide = Selenium + ScalaTest
  • Selenide = Selenium + что угодно

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

Поделитесь с нами опытом!

Нам было бы очень интересно услышать ваши отзывы - что пробовали, что получилось, с чем испытывали проблемы. Напишите нам в гуглогруппуили лично!


Viewing all articles
Browse latest Browse all 47