четверг, 25 июля 2013 г.

Selenium: завершение работы браузера

      При написании автотестов важно не забывать правильно их завершать. Для тестов, написанных с помощью вебдрайвера, после выполнения всех проверок нужно остановить браузер. У вебдрайвера есть два метода для завершения работы браузера quit и close. Различие этих методов в том, что close только закрывает текущее окно, а quit закрывает все окна, останавливает браузер и кроме того удаляет все временные файлы.

      Поэтому для корректной остановки браузера нужно пользоваться только методом quit. Можно, например, вынести завершение работы браузера в отдельный метод:

public void closeDriver() {
    //log.log(Level.INFO, "Start closeDriver");
    try{
         if (driver !=null) {
             //log.log(Level.FINE, "Closing driver...");
             driver.quit();
            driver = null;
         }
    }
    catch (Exception e){
        //log.log(Level.SEVERE, "Could not close webdriver", e);
    }

}

понедельник, 22 июля 2013 г.

Selenium: настройка driverTimeout

      При выполнении теста Webdriver выполняет все команды последовательно, не дожидаясь окончания выполнения предыдущей. Например, нажали на какую-нибудь кнопку на странице, в результате должно появиться новое поле, в которое нужно что-то ввести, но из-за асинхронной работы Webdriver команда работы с этим полем выполняется раньше, чем оно успевает появиться. Из-за этого тест может возвращать ошибку, что элемент не найден.

      Чтобы избежать этой ошибки можно каждый раз проверять наличие элемента на странице. Для этого придется использовать цикл и периодически вызывать метод findElement. Очевидно, что писать циклы для проверки наличия элемента перед выполнением каждой команды очень неудобно. К счастью, у Webdriver есть возможность задавать неявные ожидания.

      Значение неявного ожидания можно задать всего один раз, и потом Webdriver каждый раз перед выполнением команды будет пытаться найти элемент. Если же в течение указанного времени элемент не появится, то получим исключение NoSuchElementException.

       int driverTimeout = 15;
       driver.manage().timeouts().implicitlyWait(driverTimeout, TimeUnit.SECONDS);


      Включать и отключать неявное ожидание, а также менять время ожидания, можно в любой момент.