Повышаем надёжность тестов через javascript
DESCRIPTION
Доклад с конференции SeleniumCamp'2014TRANSCRIPT
Повышаем надёжность тестов через JavaScript
Игорь Хролhttp://www.khroliz.com
О себе• Игорь Хрол• QA Automation Team Lead в
Wargaming• Более семи лет в автоматизации
тестирования• Десятки проектов• Инженер, тренер, консультант,
менеджер, докладчик• Опыт работы с Selenium’ом – более 5
лет• Мой блог: http://ru.khroliz.com
Постоянный участник SeleniumCamp
О чём говорим?
• Теоретические рассуждения и общие размышления
• Практическая применимость идеи
Зависимость между уровнем тестов и поддержкой
UI-тесты ненадёжны
UI-тесты ненадёжны
Одна из причин - современные пользовательские интерфейсы:– Сложные– Асинхронные
Современные интерфейсы строятся на уже готовых компонентах
Современные интерфейсы строятся на уже готовых компонентах
Готовые компоненты можно меньше тестировать
Кастомные компоненты можно тестировать отдельно
http://seleniumcamp.com/archive/selenium-camp-2013/materials/unit-testing/
Спасибо, Dmitriy Kovalenko
Большинство современных UI имеет внутренний API
Преимущества API
• Заточен для взаимодействия с контролами• Синхронный (или есть методы для
синхронизации)
1. UI на готовых компонентах2. Готовые компоненты можно не тестировать
или тестировать отдельно3. Компоненты имеют свой API4. API компонент более надёжен, чем
WebDriver API
Использование JavaScript API вместо WebDriver
Пример из жизни
Особенности пользовательского интерфейса:• Много фреймов• ActiveX
Изначальное решение
driver.findElement(By.id(“fancy-id”)).click();
Browser
WebDriver API
Проблемы
• Интерфейс сильно асинхронный, методы работали нестабильно
• Много фреймов (более пяти вложенных) – сложно перейти к нужному контролу
• Невозможность работы с ActiveX
Browser Script API
http://docs.oracle.com/cd/B40099_02/books/OIRef/OIRefBrowseScript.html
Browser Script HTTP Server Script
Примеры
Получившийся результат
• Быстрый• Надёжный• Синхронный
Проблемы
Синхронные запросы и Alert’ы
• Вызов метода не заканчивается, пока не закрыт Alert
• Нельзя вызвать alert.accept(), так как предыдущий вызов еще не завершён
window.setTimeout
Отсутствие 100%-й эмуляции пользователя
Другие применения данной идеи
Процент сайтов с jQuery - 50-60%
Синхронизация
Преобразование jQuery-объектов в WebElement
и обратно
Поиск элементов
Получение родительского элемента
Упрощение взаимодействия со сложными элементами
Календарь Спасибо @barancev
«Самописные» элементы
«Самописные» элементы
Общая схема
Способ быстро обойти существующие проблемы в WebDriver’e
Делать обходные пути осознанно
• Делать только как временный workaround• Нужно разобраться, почему стандартный
метод не подходит
Итого• Погружение в технические детали реализации
позволяет делать более эффективные тесты• Изучение JavaScript и UI-библиотеки –
логичный шаг для UI-автоматизации• Но нужно понимать, чем жертвуем и искать
баланс
We are hiring! http://wargaming.com/ru/careers/
Игорь Хролhttp://[email protected] / [email protected]
Спасибо!Вопросы?