Автоматизированное тестирование веб-приложений на Java с использованием фреймворка Selenium
Зачем нужно автоматизированное тестирование
Ручное тестирование функций сайта или мобильных приложений может быть затратным, длительным и попросту нецелесообразным, если с самого начала все пойдет не по плану. Автоматизация помогает QA-отделу грамотно совместить разные типы тестирования с учетом типов и сложности стратегии.
Автоматизированное тестирование Java (автотестирование) – востребованное решение для ускорения процесса программирования и поддержания высокого качества web-продукта, проектирования подходящих высоконагруженных архитектур. Применение специальных программ упрощает процесс обнаружения багов, сокращает затраты и время на цикл автотестирования.
Функции проверки изменений в инструменте помогают понять, как новый код повлияет на ПО. В результате команда получает готовый программный продукт без багов и быстрее, чем при ручной проверке.
Основные преимущества автоматизации тестирования
Автоматизация (automation) дает преимущества тем, кто ее использует:
- Замена трудоемкой ручной проверки и упрощение сценариев
- Исключение багов, связанных с человеческим фактором
- Чистота контроля процесса автотеста (autotest)
- Сокращение расходов при повторно используемых скриптах
- Получение точных и надежных результатов испытаний
- Сокращение времени выхода готового продукта на рынок
- Улучшение процесса проектирования
Основы работы с Selenium
Что такое Selenium
Selenium – один из ведущих инструментов QA последних лет для автотестирования веб-приложений с открытым исходным кодом. Этот крупный пакет (контейнер) используется для операций automation, выполняемых браузерами.
Несомненный плюс – возможность запуска в различных веб-серферах и операционных системах (Windows, Linux, Solaris и Macintosh) и ОС мобильных приложений (iOS, Windows Mobile и Android).
За счет использования специфичных драйверов Selenium QA-инженеры могут писать autotest на различных языках программирования (C#, Java, Perl, PHP, Python, Ruby) и создавать продукт без ошибок.
Основная область применения Selenium – автотестирование web-программ. В состав пакета входят программы, которые решают рутинные задачи системного администрирования веб-страниц и регулярного сбора информации. К этим программам относятся: IDE, RC, WebDriver, Grid, Server.
Установка и настройка Selenium для Java
Шаги по настройке среды:
- Скачивание и установка Java Software Development Kit (JDK) в систему.
- Проверка успешной установки с помощью ввода java в командной строке.
- Установка последней сборки интегрированной среды разработки (IDE). Например, Eclipse.
- Установка и настройка библиотеки WebDrive. Распаковка ZIP-файла и завершение установки.
- Выбор web-браузеров (Chrome, Firefox, Edge или Safari).
- Распаковка zip-файла и копирование пути к файлу, который понадобится для данного шага. Например, chromedriver.exe:
Написание автотестов с использованием Selenium
Создание простого теста
В основе Selenium лежит наиболее важный компонент для выполнения кроссбраузерных нагрузочных тестов – WebDriver.
Приведем в статье простой пример использования на практике. Здесь драйвер откроет Google Chrome, увеличит размер окна и задаст поиск YouTube.
1. Создание экземпляра WebDriver для Google Chrome.
System.setProperty("chrome.driver", "path-to-driver"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize()
2. Переход по URL-адресу:
driver.manage().timeouts().wait(3000); driver.get("https://google.com");
В первой строке объявлено wait, чтобы избежать завершения задачи ошибкой, т.к. драйвер введет URL еще до того, как откроется Chrome.
3. Далее нужно дать задание открыть YouTube. Для этого изучим строку поиска:
Visual showing the inspection of the Google search bar Visual showing the inspection of the Google search bar
В консоли мы увидим атрибуты:
Visual showing console attributes
Визуальное отображение атрибутов консоли
Эти атрибуты можно использовать с помощью локаторов, чтобы определить компонент взаимодействия. В этом сценарии будет использовано его имя "q".
driver.findElement(By.name("q")).sendKeys("Youtube");
Локатор (имя) прописывается, чтобы драйвер знал, с каким элементом взаимодействовать. Дополнительно можно отправить нужную строку в той же команде с помощью функции sendKeys. В примере у нас есть значение "YouTube" в строке гугл-поиска. Теперь следует нажать кнопку поиска.
WebElement searchIcon = driver.findElement(By.name("btnK")); searchIcon.click();
Можно также использовать .click, но сохранение элемента .sendKeys упрощает взаимодействие с ним.
Использование Selenium WebDriver для управления браузером
Selenium WebDriver – это набор инструментов и библиотек, предназначенных для автоматизации взаимодействия с веб-браузерами. QA-отделы используют его для автоматизации тестирования веб-приложений. Архитектура WebDriver использует собственные API и API браузера для управления ими, что позволяет отправлять HTTP-запросы и указывать действия для браузера. Например, WebDriver может выполнять парсинг текста страницы, переход по ссылкам, заполнение форм и выполнение JavaScript-кода.
Интеграция Selenium с другими инструментами
Интеграция с JUnit для управления тестами
Selenium обеспечивает автоматизацию взаимодействия с браузером, а его интеграция с помощью адаптера JUnit дает возможность выполнять autotest в Engineering Test Management.
Адаптер управляет качеством запросов на выполнение задания. Запросы содержат выполняемые классы джава и дополнительные пути к классам. Также в запросах могут быть указаны системные свойства для виртуальной машины JVM.
По окончании проверки адаптер загружает на сервер результаты выполнения задачи и связанные вложения.
Использование Selenium Grid для параллельного тестирования
Для параллельного запуска autotest наборов на нескольких машинах применяется Grid. Этот инструмент – полностью встроенная часть проекта Selenium. Grid помогает сэкономить время за счет сокращения времени обработки результатов тестирования Java при изменении проверяемого приложения (AUT).
Grid во время testing-операций запускает параллельные задания одновременно для разных браузеров, а также для нескольких экземпляров одного web-поисковика.
Лучшие практики и советы
Как поддерживать тесты актуальными и устойчивыми
Чтобы тесты оставались актуальными и устойчивыми, QA важно соблюдать правила:
- Применять хорошие стратегии локаторов, которые вряд ли изменятся. Проверяемый элемент должен иметь стабильный идентификатор или позицию на странице, которую можно выбрать с помощью селектора CSS.
- Каждый autotest должен проверять только одну вещь. Это позволяет легко отслеживать, какой критерий анализирует файл.
- Каждый autotest должен работать автономно и не зависеть от работы других.
Обработка динамических элементов и ожидания в тестах
Элементы на web-странице, которые меняют свои атрибуты или свое существование в период жизненного цикла мобильного приложения, относятся к динамическим. Изменения могут происходить по разным причинам, в том числе из-за асинхронной загрузки с помощью запросов AJAX.
Обработка динамических элементов может оказаться сложной задачей для QA-инженеров и инженеров по автоматизации. Одна из проблем – надежность сценариев, т.к. может произойти спорадический сбой задания из-за противоречивых результатов проверки.
Динамические элементы дополнительно требуют постоянного обслуживания сценариев по причине изменений в пользовательском интерфейсе или функциональности мобильного приложения. Это способно повысить общие затраты на автоматизацию.
Проблемой является также медленное выполнение задачи из-за времени загрузки тестовыми сценариями. Задержка способна ухудшить эффективность конвейера CI/CD, особенно в быстро меняющихся средах разработки.
Во время загрузки web-страницы в браузере различные веб-элементы взаимодействия (например, кнопки, ссылки, изображения) могут загружаться с разной скоростью.
При автотестировании разные интервалы загрузки вызывают проблемы при идентификации определенных элементов. Решить эту проблему помогают команды ожидания Selenium.
Для реализации в сценариях автоматизации используются команды ожидания:
- Неявное ожидание (Implicit Wait): Задает глобальный таймаут, в течение которого WebDriver будет ждать появления элементов до момента выдачи исключения.
- Явное ожидание (Explicit Wait): Ждет выполнения определенного условия для конкретного элемента, что позволяет более точно контролировать появление элементов.
- Свободное ожидание (Fluent Wait): Позволяет задавать максимальное время ожидания и интервалы опроса, а также игнорировать определенные типы исключений во время ожидания.
Неявное ожидание дает сигнал ждать определенное время, до момента выдачи исключения.
Пример:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Явное ожидание важно в случаях, когда загрузка определенных компонентов естественным образом требует больше времени. Оно более интеллектуально по сравнению с остальными, но может применяться только к указанным элементам.
При установке неявного сценария поисковик будет ждать перед загрузкой каждого веб-компонента, что приводит к ненужной задержке выполнения автопроверки.
Пример:
WebDriverWait wait = new WebDriverWait(driver, 30); WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("foo")));
Свободное ожидание фиксирует максимальное время, пока определенный веб-элемент не станет видимым. То есть, класс Fluent Wait будет искать веб-компонент через определенные промежутки времени, пока не произойдет тайм-аут или пока объект не будет найден.
Пример:
Wait<WebDriver> wait = new FluentWait<>(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class); WebElement foo = wait.until(new Function<WebDriver, WebElement>() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("foo")); } });