Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Selenium + Thucydides. Как узнать "имя" WebDriver'а


(Natalja Librante Lace) #1

Автоматизирую тест, который должен прогоняться и в FF и в IE. Тестируемая страница сама по себе сложная, со своей спецификой, которую тоже надо учитывать…
Переопределение таймаута помогло для 30% случаев падений тестов в IE. В большинстве же своем приходится выставлять “костыли” в виде ожиданий waitABit от 1 до 7 секунд. Ожидания необходимы только для IE, в FF тест проходит замечательно и без них.
Кроме того, на методах аяксовых ожиданий (обычно что заданный элемент исчез со страницы) IE падает в 90% стучаев с сообщением о том, что элемент не найден (не найден потому, что пока IE и драйвер “думают” этот элемент действительно исчезает со страницы).

У меня возникла идея написать метод, в котором определять какой driver в данный момент тестирует приложение и в зависимости от этого выставлять паузу или использовать методы аякс-ожиданий.

что-то вроде

public void timeout(){
    if (driver = IExplorer) { //не работает в таком виде
        waitABit(5000);
    }
    else
    {
        waitForRenderedElements(By.xpath("xpath"));
    }
}

Как можно в Selenium+Thucydides определить, что driver = IExplorer?


(5am) #2

IDE под рукой нет, но может что то вроде:

if (driver is InternetExplorerDriver)
{
//some code
}

(Natalja Librante Lace) #3

Не работает…


(Aleksey) #4

Оператор is вам точно не нужен.
Информацию об используемом типе браузера можно вытянуть из экземпляра вебрайвера, доступного в классах пейджей или степов. Есть метод getDriver(), который возращает объект класса WebDriverFacade, у которого есть подходящий метод getDriverClass(), который мы и можем использовать:

((WebDriverFacade)driver).getDriverClass().getName()

Этот код даст вам полное название класса, экземпляр которого вы используете сейчас для работы с браузером. В случае ИЕ получите что-то типа “org.openqa.selenium.ie.InternetExplorerDriver”. Можете использовать getSimpleName() - он вернет просто название класса (“InternetExplorerDriver”), без пути с пакетами.

Но я бы не рекомендовал добавлять признаки исскусственного интеллекта в код (если ИЕ - то ждем, если нормальный браузер - то ищем) - это вылезет вам (или вашим последователям) при поддержке и использовании тестов. Лучше сделайте несколько конфигурационных файлов (ссылку на параметры и где размещать этот файл я вам сбрасывал в другой теме) - отдельный для ИЕ, отдельный для нормальных браузеров и используйте. В конфиге для ИЕ просто поставьте таймауты на ожидание нахождения элементов достаточно большими.


(Ruslan Semerenko) #5

В java ключевое слово звучит как instanceof. Использовать так

if (someVar instanceof SomeClass) {
    doSomething();
}

(Natalja Librante Lace) #6

Спасибо огромное!
Мне тоже не нравится такой способ установки таймаутов, но с конфигурационными файлами я пока совсем не сильна, а решение, как обычно, требуется “now”… К тому же мне надо придумать способ, как с нормальными браузерами сделать таймауты с использованием waitForRenderedElement, а в ИЕ хардкорно прописать паузы и время ожидания…