Selenium вже давно користується заслугованою популярністю серед багатьох розробників, як інструмент тестування веб-сторінок. WebDriver – “новий” селеніум, який дозволяє виконувати інтеграційні тести описані в звичному коді (Java, C#, etc) в різноманітних браузерах чи віртуальному середовищі.
В основі WebDriver лежить набір драйверів під конкретні браузери (ChromeDriver, FireFoxDriver, etc), а аткож спеціальний HtmlUnitDriver для тестування у “віртуальному браузері”, тобто без виклику та звернень до реального браузеру, що дозволяє збільшити швидкість виконання тестів, але водночас відсутнє врахування особливостей реальних браузерів. Цей драйвер напряму працює з браузером, що відрізняється від першого селеніуму – селеніум сервер більше не потрібен. Таким чином, ми можемо побудувати потужню систему інтеграційного тестування в різноманітних реальних браузерах.
Як працює WebDriver? Кожен драйвер викликає реальний браузер та транслює команди до нього, повертаючи результати виконання до вашого коду.
Основні операцій у WebDriver наступні:
- пошук елемента (locator strategy: по ІД, CSS, XPath, etc)
- операції над знайденими елементами (отримання значення елемента/тексту, введення значення в поля, клік)
- виконання javascript
Виглядає використання фреймворку наступним чином (типово): пишеть звичайний тест (наприклад, ТеstNG). У цьому тесті створюється драйвер до браузера і йде опитування сторінок за допомогою патерну PageObject. PageObject – популярний патерн проектування, що дозволяє відділити логіку виконання виконання від їх реалізації. PageObject модулює в собі сторінки, що тестуються, за допомогою анотацій ми звертаємося до елементів (тобто вони інджектаються) і надалі можемо з ними працювати; самы ынстанци обджектыв створюються выдповыдно фабрикою. Як резельтат зменшення коду, що дублюється та збільшення повторного використання. Типово, клас для пейджОбджект виглядає десь так (Encapsulation in Action):
public class GoogleSearchPage {
protected WebDriver driver;
@FindBy(id="q")
private WebElement searchField;
@FindBy(name="btnG")
private WebElement searchButton;
public AnnotatedGoogleSearchPage(WebDriver driver) {
this.driver = driver;
}
public void open(String url) {
driver.get(url);
}
public void close() {
driver.quit();
}
public String getTitle() {
return driver.getTitle();
}
public void searchFor(String searchTerm) {
searchField.sendKeys(searchTerm);
searchButton.click();
}
public void typeSearchTerm(String searchTerm) {
searchField.sendKeys(searchTerm);
}
public void clickOnSearch() {
searchButton.click();
}
}
Особлива частина ф-ціональності, якій особливо слід приділити увагу – це функціонал для очікування. Наприклад, якщо тест виконуєтья швидше ніж реально лоадиться сторінка, виконується AJAX запит чи ініціалізується портлет – це може призвести до NoSuchElementException
ВебДрайвер підтримує два типи очікувань: явні та неявні. Неявне очікування діє по замовчюванню і полягає в тому, що вебдрайвер буде автоматично опитувати елемент на протязі вказаного часу – по замовчуваню значення 0, але його можна змінити за допомогою команди на кшталт:
Неявне очікування встановлюється на рівні драйвера, отже діятиме для всіх елементів під час тестування цим драйвером. Інший недолік – неможливість відловити такі події, як зміна властивості елементу. У цих випадках слід використовувати явне очікування, що задається для конкретного елементу за допомогою реалізації інтерфейсу (колбеку) ExpectedCondition.
Типовий приклад використання можна знайти за адресою http://code.google.com/p/selenium/wiki/GettingStarted, де “тестується” пошукова сторінка гугла
Фреймворк Thucydides – спосіб писати більш гнучкі та інформативні тести поверх ВебДрайвер. Цей фреймворк реалізує паттерн PageObject та дозволяє знімати скріншоти з екрану під час виконання тесту та генерить детальну статистику по тесту. Додатковий бонус – можливість специфікувати сценарій одразу в коді тесту – тобто перейти то створення специфікації через тестування
Tip & Tricks
1. JSF2 Цей фреймворк, та всі похдіні, традиційно має проблеми – і селеніум не виключення. Щоб мати можливість звертатися до елементів по ID, слід вимкнут ці страшні автозгенеровані айдішки, за допомогою prependId=”false” на формі
2. Фрейми Перед доступом до контенту фреймі, на нього слід перейти
driver.switchTo().frame(“frameName”)
3. Базова аутентифікація ВебДрайвер не має можливстей для роботи з вікном базової аутентифікації, проте більшість браузерів дозволяють УРЛ вигляду http://user:password@example.com, що дозволяє логінитися з вебдрайверу. Щоправда, сапорт такої фічі слід спочатку увімкнути у браузері, наприклад у Firefox слід встановити наступний прапор browser.safebrowsing.malware.enabled
! Не використовуйте Selenium 1 у 21у столітті !