Нет времени объяснять. Часть 1. Selenium и Python

Нет времени объяснять! Срочно нужно автоматизировать тесты по авторизации на сайте. Ты тестировщик — ты и делай.

Disclaimer: пост рассчитан на публику знакомую с синтаксисом языка Python. В случае если вам это чуждо — рекомендую PythonTutor.
Наверное кто-нибудь из вас сталкивался с такой ситуацией, не правда ли? Никогда не знаешь с чего начать, особенно если ты даже не знаком с автоматизацией. Сегодня я расскажу как решить проблему, когда «вот прям сейчас надо», а ты «ни в зуб ногой». Тут не будет идеальных решений, тут будет описано исключительно то, как быстро и безболезненно наговнокодить написать автотесты «на коленке» в экстренной ситуации.

Все начинается там…

Конечно же самое первое и самое важное — настроить для себя инфраструктуру. В нашем случае это установка Python.
Если вы счастливый обладатель компьютера под управлением Debian-подобных ОС, то самый простой для вас способ это:

sudo apt install python2

Если вы не менее счастливый обладатель Windows — милости просим на сайт Python за свежими пакетами установки Python 2.7. Настоятельно рекомендую устанавливать именно 2 версию «питона» — на данный момент большинство библиотек совместимы именно с этой версией. Для пользователей Windows так же рекомендую не забыть включить галочку про добавление исполняемых файлов в PATH системы.
Обладатели MacOS могут так же воспользоваться официальным сайтом Python, либо же использовать пакетный менеджер Homebrew:

brew install python

Обязательно проверьте в консоли своей ОС доступность следующих команд:

python -V
pip -V

В случае если они не доступны — нужно проверить, добавлен ли путь до исполняемых пакетов Python в системную переменную PATH.
Так же для проведения тестов нам понадобится установленный Google Chrome — если у вас его нет, то придется поставить — с ним проще всего 🙂
На этом приготовления закончились. Отправляемся в бой!

Пишем очень плохо, но быстро

Начнем мы пожалуй с того, как писать не надо, но можно нельзя, если очень хочется.
Создайте папку, в которой вы будете вести свой проект. В ней так же нужно создать два файла: requirements.txt и run.py, в последнем и будет размещаться код нашей программы. В итоге должна получиться следующая структура:
<папка проекта>\
— requirements.txt
— run.py
В файл requirements.txt необходимо добавить следующее:

elementium
webdriver_manager

Для чего это нам нужно — файл с именем requirements.txt представляет собой список с зависимостями, которые должны быть удовлетворены, для работы с конкретным проектом. В нем могут быть указаны как просто названия пакетов или Git репозиториев, так и указания какие именно версии пакетов нам нужны. Это может потребоваться, в случае если вы используете библиотеки, которые часто меняются и достаточно радикально. Чтобы в один прекрасный день весь ваш код не поломался — стоит указывать версии, но т.к. мы пишем самый простой вариант — указывать мы их не будем. Теперь нам нужно их установить, для этого выполняем следующую команду:

pip install -r requirements.txt

В случае с Linux может потребоваться запустить эту команду с Root правами. По окончании установки переходим непосредственно к написанию кода.
Далее открываем run.py в любом удобном текстовом редакторе и добавляем следующие строчки:

# encoding: utf-8
from __future__ import unicode_literals

Что они нам дают? Они помогают нам избавиться от главной проблемы Python 2 — работы с Unicode символами. После этих «слов» уже не придется задумываться есть ли у вас Unicode символы в переменных с которыми вы работаете.
Далее идут необходимые для работы импорты только что установленных нами библиотек:

from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from elementium.drivers.se import SeElements

Все необходимые для работы компоненты мы импортировали. Теперь приступим к написанию простейшего блока кода, который будет открывать главную страницу Google.

se = SeElements(webdriver.Chrome(ChromeDriverManager().install())) # указываем, что будем использовать драйвер Chrome, и в случае чего ChromeDriverManager установит его для нас
se.navigate('https://google.ru/')

Вот и всё. Мы открыли Google. Теперь попробуем там поискать что-нибудь, и проверить, что первая ссылка ведет на нужный для нас сайт. Для того чтобы ввести что-то в поисковую строку необходимо использовать локаторы. Самый простой способ — найти элемент по значению у него поля class или id. Для того чтобы указать конкретный класс для поиска перед названием класса устанавливается точка .class, а для того, чтобы найти элемент по его id — #id. В случае, если необходимо найти элемент по какому-то другому полю, например name используют конструкцию [name='value']. Воспользуемся этим, для того, чтобы найти строку поиска на сайте и ввести в нее данные:

search_field = se.find("[name='q']")
search_field.write("parviz.pw" + Keys.RETURN) # вводим поисковый запрос и нажимаем Enter, как бы мы сделали это руками

Теперь нам нужно проанализировать полученный список ответов, и убедиться, что первая ссылка ведет на запрошенный сайт, для этого мы найдем весь список URL на которые ведут результаты поиска, выберем первый, и проверим, что в нем есть parviz.pw:

urls = se.find("cite") # находим все подписи к заголовкам с адресами сайтов
first_url = urls.get(0) # выбираем первый элемент
print first_url.text() # выводим в логи его содержание
assert "parviz.pw" in first_url.text(), "Я искал другой сайт :(" # проверяем, что в нем содержится наш адрес запроса

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

# encoding: utf-8
from __future__ import unicode_literals
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from elementium.drivers.se import SeElements
se = SeElements(webdriver.Chrome(ChromeDriverManager().install()))
se.navigate('https://google.ru/')
search_field = se.find("[name='q']")
search_field.write("parviz.pw" + Keys.RETURN)
urls = se.find("cite")
first_url = urls.get(0)
print first_url.text()
assert "parviz.pw" in first_url.text(), "Я искал другой сайт :("
se.browser.quit()

Для его запуска нам понадобится командная строка. Для этого запустите командную строку в папке проекта и выполните команду:

python run.py

Поздравляю! Теперь вы познакомились с простым вариантом написания автотеста с использованием Python, Selenium и Elementium — надстройкой над Selenium для упрощения взаимодействия с элементами на странице.
В следующей части статьи мы рассмотрим более сложные случаи, а так же способ интеграции с PyTest для правильной организации тестов.