среда, 15 декабря 2010 г.

Мелкие кремниевые полезности

Selenium - это бесплатное и очень удобное средство автоматизации веб приложений. Работает как библиотека на разных языках (Java, C#, Ruby, PHP, Perl, Python), подключаемая к вашему тестовому сьюту. Там большое количество атомарных методов, но для большего удобства постоянно приходится немного дорабатывать различными дополнительными методами.

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

Приведу пару примеров, а заодно сохраню их у себя :)



public boolean waitForTextPresent(String textToWaitFor, int howLong) {
        boolean resultFlag = false;
        for (int second = 0; second <= howLong; second++) {
            if (super.isTextPresent(textToWaitFor)) {
                resultFlag = true;
                break;
            } else {
                resultFlag = false;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        return resultFlag;
    }
Очень полезно, например, для проверки действий с сообщением об ошибке или наоборот об успешном завершении асинхронного процесса. Проверка происходит раз в секунду. Передаем текст, который ждем и максимальное время ожидания. Использованием isElementPresent можно добиться того же для любого элемента по XPath. Или isVisible если элемент есть, но должен показаться на странице. Или любой другой похожий is-метод.

Из такого метода потом можно собирать конструкции как clickAndWaitForElementPresent. Например, 


public void clickElementWaitForElementPresent(String elementLocator, String elementLocatorToWaitFor) {
        click(elementLocator);
        pause(2048);//пауза плохая практика, но я ее здесь специалльно оставил, чтобы понимать, что иногда она нужна в ткаих случаях и нужно не забывать, что селениум с ожиданием может иногда сбоить
        if (!waitForElementPresent(elementLocatorToWaitFor)){
            logWarning("[clickElementWaitForElementPresent] - element "+ elementLocatorToWaitFor+" was not found]");
        }
    }


Есть также некоторые другие особенности, не связанные с AJAX. Метод Selenium isTextPresent() ищет, как ни странно :), только текст на странице. Т.е. все для text(). Соответственно если вы хотите убедится в том, что тест есть на странице  и/или он есть также в input, то необходимо использовать другой метода. Потому что текст input контролов хранится как значение аттибута value и потому необходимо расширить метод для таких случаев.


public bool isTextPresent(String text) {
        return super.isTextPresent(text) || super.isElementPresent("//*contains(@value,'" + text + "')]"));
    }


Буду добавлять ещё ...

Комментариев нет:

Отправить комментарий