Конвертируем Selenium веб-драйвер для Python 3.x

в 11:08, , рубрики: Firefox, integration testing, python, python3, selenium, webdriver, Веб-разработка, интеграционное тестирование, Песочница, метки: , , , , , ,

Итак, вы задались целью отладить своё веб-приложение. Вам хочется, чтобы браузер «сам тыкал» на кнопочки, ходил по ссылкам и при этом ещё и проверял состояние элементов. Словом хочется вам интеграционного тестирования, чтобы некий скрипт задавал сценарий действий пользователя и при этом параллельно проверял состояние элементов и изменения в базе данных.

Допустим вы находите или где-то уже слышали, или даже давно хотели попробовать специальный инструментарий для этих дел, зовущийся Selenium WebDriver. Вы идёте на сайт Selenium и радостно прыгаете от восторга: поддерживается ваш любимый скриптовый язык Python! Но увы, как и в случае с Django у разработчиков ещё не дошли руки до Python 3.x. Так что все вкусные синтаксические куски рафинада, а также встроеная поддержка UTF-8 по умолчанию не поддерживаются.

Однако, вооружившись знаниями о различиях между Python 2 и 3, а также стандартной утилитой 2to3.py мы в два счёта поборем всё то, что мешает нашему счастью и всеобщему прогрессу в разработке тестовых скриптов для интеграционного тестирования.

В первую очередь вам потребуется скачать собственно WebDriver Selenium для старого и не всегда доброго Python 2+, чтобы не бродить по сайту и не скачать чего-нибудь ненужного, вот ссылка на страницу скачивания, там вам нужен только один tar.gz файл вида «selenium-<версия>.tar.gz».

В общем-то по идее надо скопировать оттуда в папку Python3xLib содержащуюся в данном архиве папку selenium, применить к ней 2to3.py, после чего останется немного подкорректировать один файл: «remote_connection.py». Дело в том, что в старом недобром Python 2.x почти как в C/C++ строка совсем никак не отличалась от массива байт, т.е. по сути не делалось различия между символом и байтом. Соответственно по сей день в старых питоновских приложениях всевозможные сетевые библиотеки посылают и принимают по сети строки(!) вместо массива байт. Справится с этой бедой нам помогут две функции: encode() у строки и decode() у массива байт соответственно.

В принципе я уже давно написал скрипт для автоматизации данного преобразования, разумеется всё на том же Python 3, и даже выложил его в свой Issue по поддержке Python 3 в группе разработчиков Selenium (сей топик создан мной ещё раньше, с тех пор видимых подвижек в сторону поддержки третьего питона не намечается). Прямая ссылка на скрипт: pyselenium.py, ссылка на топик по поддержке Python 3.x для веб-драйвера Selenium: Support Python 3.x for Selenium WebDriver.

Скрипт pyselenium.py принимает на вход tar.gz файл, который вы скачали в самом начале, скрипт принимает в качестве аргумента путь к архиву, после чего копирует selenium в папку Python3xLib и преобразует работу веб-драйвера в соответствии с реалиями Python 3 и строк в UTF-8. По сути в скрипт сначала запустит утилиту 2to3.py, после чего вставит в нужные места encode() строки перед отправкой по сети, а потом decode() в строку полученные данные.

В принципе скрипт вполне читаемый, короткий и понятный, спасибо за это языку Python. Всё что потребуется скрипту для работы — интерпритатор Python 3.x и собственно файл с архивом.

Проверить можно с помощью интерактивного режима python:
>>>from selenium.webdriver import Firefox
>>>driver = Firefox()
>>>driver.get('http://ya.ru/')

Должен появиться наш брат Огненная Лиса и загрузить нам указанный сайт.
Дальнейшее использование драйвера зависит только от вашей фантазии.

Более подробно о работе с Selenium WebDriver читайте тут:
документация по Selenium Webdriver

Автор: Qualab


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js