Translate

вівторок, 6 листопада 2012 р.

Selenium WebDriver - тестування web-сторінок з Java


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, але його можна змінити за допомогою команди на кшталт:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
Неявне очікування встановлюється на рівні драйвера, отже діятиме для всіх елементів під час тестування цим драйвером. Інший недолік - неможливість відловити такі події, як зміна властивості елементу. У цих випадках слід використовувати явне очікування, що задається для конкретного елементу за допомогою реалізації інтерфейсу (колбеку) 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у столітті !