Что пишут в блогах

Подписаться

Очные тренинги

Все очные тренинги
Оставь заявку на тренинг в своем городе

Онлайн-тренинги

  • Все онлайн-курсы
  •  

    http://software-testing.ru/about/authors/9-barancev

    Разделы портала

    VIP-вакансии

    Наши партнёры

    www.it4business.ru

    UML2.ru

    SysIQ Inc.

    Selenium 2.0: замедляем тесты и подсвечиваем элементы
    22.08.2011 10:49

    Автор: Алексей Баранцев

    Это очень короткая и не совсем типичная для меня статья. Меня обычно беспокоит противоположный вопрос – как сделать, чтобы Selenium не тормозил. Но недавно участники тренинга “Программирование для тестировщиков” задали мне вопрос, можно ли замедлить выполнение тестов, потому что они выполняются слишком быстро и поэтому “не видно, что там происходит”. С одной стороны, приятно, что Selenium такой шустрый. Но с другой стороны, раз надо замедлить – почему бы и нет. Поскольку я в последнее время всех агитирую переходить на WebDriver, то есть Selenium 2, здесь я тоже расскажу, как это реализовать на новой версии. А заодно расскажу ещё и о том, как заставить WebDriver подсвечивать элементы перед тем, как кликнуть или ввести какие-нибудь данные, ибо реализуется это с использованием того же самого механизма.

    Selenium 2 содержит специальный класс, предназначенный как раз для решения такого рода задач – EventFiringWebDriver. Он представляет собой обертку вокруг “обычного” драйвера, которая используется следующим образом:

    WebDriver regularDriver = new FirefoxDriver();
    EventFiringWebDriver driver = new EventFiringWebDriver(regularDriver); 
    driver.registerListener(new ListenerThatWaitsBeforeAnyAction(5, TimeUnit.SECONDS));

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

    Устроен он так: он расширяет ничего-не-делающий класс AbstractEventFiringListener и переопределяет в нём все методы, соответствующие действиям пользователя (кликам, заполнениям полей, нажатиям кнопок back и forward) следующим образом:

    @Override
    public void beforeClickOn(WebElement element, WebDriver driver) {
    try {
    Thread.sleep(timeout);
    } catch (InterruptedException e) {
    }
    }

    Перед каждым действием EventFiringWebDriver будет сначала обращаться к зарегистрированному обработчику событий, который сделает паузу указанной длительности, замедляя тем самым выполнение тестов и давая пользователю возможность следить за происходящим.

    В приложении имеется ещё один класс-обработчик ListenerThatHiglilightsElements, который можно зарегистрировать в EventFiringWebDriver вместо замедлителя, и который будет не только “притормаживать” тесты, но и подсвечивать их перед выполнением какого-либо действия. Чтобы элемент мигнул три раза по полсекунды, его надо подключить вот так:

    EventFiringWebDriver driver = new EventFiringWebDriver(regularDriver);  
    driver.registerListener(new ListenerThatHiglilightsElementsBeforeAnyAction(3, 500, TimeUnit.MILLISECONDS));

    Вот как устроен внутри этот обработчик:

    @Override
    public void beforeClickOn(WebElement element, WebDriver driver) {
    flash(element, driver);
    }
    @Override
    public void beforeChangeValueOf(WebElement element, WebDriver driver) {
    flash(element, driver);
    }
    private void flash(WebElement element, WebDriver driver) {
    JavascriptExecutor js = ((JavascriptExecutor) driver);
    String bgcolor = element.getCssValue("backgroundColor");
    for (int i = 0; i < count; i++) {
    changeColor(color, element, js);
    changeColor(bgcolor, element, js);
    }
    }
    private void changeColor(String color, WebElement element, JavascriptExecutor js) {
    js.executeScript("arguments[0].style.backgroundColor = '"+color+"'", element);
    try {
    Thread.sleep(interval);
    } catch (InterruptedException e) {
    }
    }

    Разумеется, аналогичным образом можно реализовать и другие расширения стандартной функциональности Selenium 2 – журналирование действий, снятие скриншотов в подходящий момент, обработку типовых ошибок и тому подобное.

    Приложение

    selenium-events.zip -- в архиве находится проект для Eclipse, содержащий описанные в статье классы-обработчики и примеры их использования.

    Обсудить в форуме

     

    Добавьтe Ваш комментарий

    Ваше имя (псевдоним):
    Ваш адрес почты:
    Заголовок:
    Комментарий: