Как стать автором
Обновить

Интеграция Django и Selenium

Время на прочтение3 мин
Количество просмотров8.1K


Всем привет.

Ни для кого не секрет что тестирование приложений является важным этапом разработки ПО, а если вы разрабатываете веб-приложения, то вам просто необходимо тестировать веб-интерфейс. К счастью, для этой цели существует такой инструмент как Selenium. Небезызвестные на хабре компании СКБ Контур и Яндекс уже выбрали его как инструмент функционального тестирования своих приложений и сервисов (Яндекс рассказывал об этом на недавно прошедшей YaC).

Теперь к делу.
В одном из проектов, над которым я работаю, мы использовали Selenium начиная еще с первой ветки. Но время не стоит на месте, вышел Selenium 2.0, основанный на технологии webdriver, более функциональный, удобный, и правильно имитирующий события в браузере (подробнее о преимуществах).

Чтобы не заниматься обновлением старого кода поддержки Selenium внутри нашего приложения (а вдруг это придется делать еще и не один раз?), а также чтобы попробовать сделать что-то полезное для других разработчиков, мы решили сразу вынести интеграцию с Selenium в отдельную библиотеку.

Далее я опишу что у нас получилось и как использовать эту библиотеку.

Установка


Библиотеку можно взять с https://github.com/dragoon/django-selenium или установить через pip:
pip install django-selenium

Возможности


Прежде всего библиотека позволяет интегрироваться с подсистемой тестирования django. Вы можете либо просто указать в настройках использовать TestRunner из библиотеки:
TEST_RUNNER = 'django_selenium.selenium_runner.SeleniumTestRunner'
либо унаследовать его и написать свой класс.
За кулисами SeleniumTestRunner проделывает следующие операции:
  • запускает сервер selenium-server.jar
  • запускает экземпляр тестового сервера с тестовыми fixtures
Далее, чтобы начать писать Selenium тесты необходимо создать в приложении файл seltests.py, по аналогии с обычным tests.py. Затем вы просто наследуете класс теста от django_selenium.testcases.SeleniumTestCase и пишите тесты, используя команды Selenium для взаимодействия с браузером.

Расширение стандартного драйвера

Для облегчения выполнения стандартных операций был написан расширенный класс драйвера, взаимодействующего с браузером, — django_selenium.testcases.MyDriver. Он содержит такие операции как открыть url, авторизоваться на сайте (стандартная форма django), найти элемент по css селектору, найти элемент и произвести клик, проверить присутствие текста на странице, получить текст алерта и другие. За подробностями прошу пока обращаться к исходному коду класса MyDriver.

Замена команды выполнения тестов

Наконец, чтобы заменить стандартную команду выполнения тестов django на команду с поддержкой selenium тестов, необходимо где-либо в своем приложении унаследовать класс команды следующим образом:
from django_selenium.management.commands import test_selenium

class Command(test_selenium.Command):

    def handle(self, *test_labels, **options):
        super(Command, self).handle(*test_labels, **options)
Команда поддерживает две дополнительные опции:
  • --selenium — выполнить все тесты, включая Selenium тесты
  • --selenium-only — выполнить только Selenium тесты
Как и в случае стандартной команды, можно запускать Selenium тесты для конкретного приложения или только определённый тест из приложения.

Тестовое приложение


Чтобы закрепить сказанное выше я, подготовил небольшое django приложение содержащие один selenium тест:

# Скачиваем selenium-server.jar
wget http://selenium.googlecode.com/files/selenium-server-standalone-2.7.0.jar

git clone git://github.com/dragoon/django-selenium-testapp.git
cd django-selenium-testapp
# Установить правильный путь в переменную SELENIUM_PATH
vi settings.py

# Запускаем тесты
./manage.py test --selenium-only
...
----------------------------------------------------------------------
Ran 1 test in 13.254s

OK

Если все пошло верно, должна наблюдаться следующая картина:


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

Спасибо за внимание.
Теги:
Хабы:
Всего голосов 50: ↑45 и ↓5+40
Комментарии16

Публикации

Истории

Работа

Python разработчик
120 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань