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

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

.
Легкое веб-тестирование с Python, Pytest и Selenium WebDriver, часть 3: установка Selenium WebDriver при помощи Python и Chrome
06.07.2020 00:00

Автор: Энди Найт (Andy Knight)
Оригинал статьи
Перевод: Ольга Алифанова

Теперь, когда наш тест-проект создан, напишем несколько Web UI-тестов при помощи Selenium WebDriver!

Что такое WebDriver?

WebDriver – это программируемый интерфейс для взаимодействия с живыми веб-браузерами. Он позволяет тест-автоматизации открывать браузер, передавать клики, вводить символы, удалять текст, и чисто завершать работу с браузером. Интерфейс WebDriver рекомендован W3C. Самый популярный вариант реализации стандартов WebDriver – это Selenium WebDriver, бесплатный инструмент с открытым исходным кодом.

У WebDriver несколько компонентов:

  1. Языковые комплекты. Программные пакеты вроде Selenium WebDriver предоставляют комплекты языков программирования для взаимодействия с браузером. Selenium поддерживает основные языки вроде C#, Java, JavaScript, Ruby и Python.
  2. Код автоматизации. Программисты используют языковые комплекты для автоматизации взаимодействий с браузером. Распространенные взаимодействия – это, например, поиск элементов, клик по ним, и очищение текста. Обычно это пишется при помощи фреймворка тест-автоматизации.
  3. Протокол JSON Wire. Языковые комплекты кодируют любые взаимодействия, используя JSON, и отправляют их как запросы REST API к драйверу браузера. Протокол JSON Wire независим от языка и платформы.
  4. Драйвер браузера. Драйвер – это самостоятельный исполняемый модуль на тест-машине. Он работает как прокси между функцией, вызывающей взаимодействие, и браузером. Он получает запросы JSON для взаимодействий и отправляет их в браузер через HTTP.
  5. Браузер. Браузер обрабатывает тестируемые веб-страницы. Он в основном контролируется драйвером. Все основные браузеры поддерживают WebDriver, но каждому также нужен свой собственный тип драйвера, установленный на той же машине, что и браузер, и доступный по системному пути. К примеру, Google Chrome требует ChromeDriver.

Установка Selenium WebDriver

Для нашего тест-проекта мы будем использовать Python-комплекты Selenium WebDriver, а также Google Chrome и ChromeDriver. Можно пользоваться любым браузером, но давайте возьмем Chrome – у него, во-первых, очень высокая доля рынка, а во-вторых, есть инструменты разработчика, которые пригодятся позднее.

Убедитесь, что на вашей машине установлена самая свежая версия Chrome (для проверки и обновления Chrome перейдите в меню и выберите Help > About Google Chrome. Другой вариант – загрузите и установите его отсюда). Затем скачайте подходящую версию ChromeDriver тут и добавьте его в ваши системные пути.

Убедитесь, что СhromeDriver работает из командной строки:

  1. $ chromedriver
  2. Starting ChromeDriver 73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72) on port 9515
  3. Only local connections are allowed.
  4. Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

Затем установите пакет Selenium Python в наше окружение:

  1. $ pipenv install selenium --dev

Теперь машина готова для веб-тестирования!

Новые тесты

Создайте новый модуль Python в директории tests/ по имени test_web.py. Этот новый модуль будет содержать наши Web UI-тесты. Теперь добавьте следующие импорты:

  1. import pytest
  2. from selenium.webdriver import Chrome
  3. from selenium.webdriver.common.keys import Keys

Зачем они нам нужны?

  • pytest будет использоваться для фикстур
  • Chrome предоставляет комплект ChromeDriver.
  • Keys содержат специальные нажатия клавиш для браузерных взаимодействий.

Настройка и очистка WebDriver

Хорошая практика – когда каждый тест-кейс использует собственную копию WebDriver. Настройка и очистка добавляют несколько секунд к каждому тесту, однако отдельная копия для каждого теста сохраняет их простоту, безопасность и независимость. Если один тест наткнется на проблему, это не затронет другие тесты. К тому же использование отдельной копии WebDriver для каждого теста позволяет запускать их параллельно.

Лучше всего настраивать WebDriver при помощи фикстуры pytest. Фикстуры – это модные функции pytest для настройки и очистки, а еще они умеют внедрять зависимости. Любой тест, требующий копии WebDriver, может просто вызвать фикстуру для его получения.

Код

Добавьте вот такой код в tests/test_web.py:

  1. @pytest.fixture
  2. def browser():
  3. driver = Chrome()
  4. driver.implicitly_wait(10)
  5. yield driver
  6. driver.quit()

browser – это фикстурная функция pytest, как указано в декораторе @pytest.fixture. Давайте рассмотрим каждую строчку, чтобы понимать, что делает эта новая фикстура.

Строки

driver = Chrome()

Chrome() инициализирует копию ChromeDriver на локальной машине, используя настройки по умолчанию. Возвращенный объект драйвера привязан к копии ChromeDriver. Все вызовы WebDriver будут выполняться через него.

driver.implicitly_wait(10)

Самая болезненная часть тест-автоматизации Web UI – это ожидание загрузки или изменения страницы после инициации взаимодействия. Странице нужно время на обработку новых элементов, и если автотест попытается получить доступ к новым элементам до того, как они начнут существовать, WebDriver выдаст исключение NoSuchElementException. Неправильное ожидание – богатый источник "нестабильности" Web UI-тестов.

Метод implicitly_wait говорит драйверу подождать существования элементов не более 10 секунд, прежде чем пытаться их найти. Механизм ожидания довольно умен – вместо того, чтобы спать полные 10 секунд, он прекратит ожидание сразу после появления элемента. Неявные ожидания декларируются один раз, и затем автоматически используются для всех элементов. В отличие от них, явные ожидания могут быть заданы отдельно для каждого взаимодействия – ценой необходимости явных вызовов ожидания. Хорошая практика – использовать один стиль ожидания эксклюзивно для тест-автоматизации. Смешивание явных и неявных ожиданий может иметь мерзкие и неожиданные побочные эффекты. Для нашего проекта неявное 10-секундное ожидание должно быть достаточным (если у вас медленное Интернет-соединение, повысьте этот таймаут для компенсации).

yield driver

Фикстура pytest должна возвращать значение, сообщающее, что именно настраивалось. Наша фикстура возвращает ссылку на инициализированный WebDriver. Однако вместо выражения return она использует yield, что означает, что фикстура – генератор. Первая итерация фикстуры – в нашем случае, инициализация WebDriver – это фаза "настройки", которая вызывается до того, как начался тест. Вторая итерация – вызов выхода – это фаза очистки, вызывающаяся после завершения теста. Запись фикстур как генераторов объединяет в одно целое связанные операции настройки и очистки.

driver.quit()

Всегда выходите из копии WebDriver в конце теста, что бы ни случилось. Процессы драйвера на тест-машине не всегда умирают после окончания автоматизации. Отсутствие явного выхода из копии драйвера может оставить его запущенным как зомби-процесс – а это может привести к потреблению и даже блокировке системных ресурсов.

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