Selenium + Python “First blood”

Denys Korytkin
3 min readAug 9, 2018
Image by Rambo “First Blood”

В предыдущей статье рассказывал, что нужно для старта написания тестов, можно почитать тут “Fear and Loathing Manual QA”.

С чего же все таки начать свой первый тест?

  • Для начала нужно определиться с тестируемым приложением
  • Написать тест кейсы, нам хватит и одного
  • Определиться с фреймворком для запуска тестов (pytest, unittest, nose)

# Installations

# Устанавливаем Python3
$> sudo apt-get install python3-pip
# Устанавливаем Chrome браузер
$> sudo apt install google-chrome-stable
# Достаем последнюю версию chrome driver
$> CHROME_DRIVER_VERSION=$(wget http://chromedriver.storage.googleapis.com/LATEST_RELEASE -q -O -)

# Скачиваем chrome driver
$> wget --no-verbose -O /tmp/chromedriver_linux64.zip https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip

# Распаковываем
$> sudo unzip /tmp/chromedriver_linux64.zip -d /opt/selenium

# Линкуем расположение драйвера
$> sudo ln -fs /opt/selenium/chromedriver /usr/bin/chromedriver

Create virtual envirion

Для начала нужно изолировать свой проект от системной среды, что бы не было проблем с разными версиями зависимостей.

Подробнее почитать можно тут: habr

# Создаем директорию для проекта и переходим в нее
$> mkdir first_test
$> cd first_test
# Создаем виртуальное окружение и активируем его
$> python3 -m venv my_env
$> source my_env/bin/activate

Create requirements

Описываем requirements.txt с нужными для проекта библиотеками определенных версий. Помогает правильно установить окружение для проекта. Главное не забывать добавлять зависимости в файл перед установкой в свое окружение, а то потом получается “На моей машине все работает” 😉

Пример файла:

$> cat requirements.txtselenium==3.12.0
pytest==3.7.1

Установка всех зависимостей:

$> pip install -r requirements.txt

# Test case

Напишем простенький тест на всем известный поисковик

  • Открыть браузер Google Chrome
  • Перейти на главную страницу https://google.com.ua/
  • В поисковую строку ввести ввести слово “Selenium”
  • Подтвердить ввод, нажав “Enter”
  • Дождаться результатов поиска
  • Проверить, что результатов больше “0”
  • Проверить, что в каждом заголовке есть слово “Selenium”

# Raw Selenium

Создадим наш первый тестовый модуль

$> touch test_google_search.py

Напишем первый тест

from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By



def test_google_search():
# Открыть браузер
driver = Chrome()
# Переход на страницу
driver.get('https://google.com')
search_input = driver.find_element_by_name('q')
# Ввод текста
search_input.send_keys('Selenium')
search_input.submit()

# Проверка результатов поиска
search_result = driver.find_elements(
by=By.CSS_SELECTOR,
value='#rso .srg div.g'
)
assert len(search_result) > 0
for result in search_result:
title_text = result.find_element_by_tag_name('h3').text
assert 'Selenium' in title_text

Примечание!

assert len(search_result) > 0

Эта проверка обязательна в тесте, так как возможна ситуация с пустым результатом поиска, find_elements не упадет с ошибкой (Элемент не найден), а вернут пустой список, не пройдет ни одной итерации и соответственно проверок тоже не будет 😟 нужно быть внимательней

# Start tests

В зависимостях мы так же добавляли pytest, с помощью него и будем запускать 😉

$> pytest test_google_search.py -v

Результат работы, не заставит долго ждать! Первый тест прошел успешно 🎉

Pytest вывод результатов

Что еще нужно сделать?

  • Проверить, что если мы изменим assert наш тест будет падать
  • Добавить ожидание результатов поиска и наш тест не был “flaky”
  • После прохождения теста, остается открытый браузер, что не очень хорошо

Добавим ожидание результатов поиска, так как не всегда приложение успевает отобразить нужный элемент до того как selenium попробует его найти

...
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.expected_conditions import (
visibility_of_all_elements_located
)
def test_google_search(driver):
...
search_result = WebDriverWait(
driver=driver,
timeout=10,
poll_frequency=1
).until(
method=visibility_of_all_elements_located(
(By.CSS_SELECTOR, '#rso .srg div.g')
),
message='Empty search result'
)
...

Теперь тест упадет по TimeoutException если выдача будет пуста в течении 10 секунд (poll_frequency означает, сколько секунд ждать перед следующей попыткой). Кстати теперь проверка assert len(search_result) > 0 уже не нужна.

Опишем создание и удаление браузера

import pytest
@pytest.yield_fixture()
def driver():
driver = Chrome()
yield driver
driver.quit()


def test_google_search(driver):
...

Теперь при старте теста будет запускать, браузер, а по окончании закрываться, Больше про методы и команды pytest можно почитать в документации.

Первый тест готов, “фундамент положен”, можно приступать к написанию новых тестов 😉

# To be continued

Image by Rambo “First Blood”

--

--