Публікуємо Автоматизований тест Python + Selenium WebDriver з надзвичайно прикольного сайту присвяченого суто автоматизованому тестуванню autotest.org.ua ➡ обов’язково завітайте в гості, не пошкодуєте. Уся інформація на сайті подається просто і максимально розжовано.
Саме цей автотест став мені у нагоді, під час навчання на курсі Автоматизованого тестування Python від нашої спільноти тестерів QualityAssuranceGroup.
Для тестування свого навчального проекту я його переробляла згідно своїх цілей: заміною XPath на свої веб елементи і додала негативний сценарій логування. Але викладаю не свій варіант, а у перекладі автора. Так буде краще, на мою думку, бо кожен зможе спробувати його повторити на загальнодоступному сайті. Потрібно тільки зареєструватися і створити скриньку на ukr.net
Поїхали! Розпочинаємо наш автоматизований тест з попередньої підготовки мінімальної інфраструктури.
1.Установка Python. Я як і первинний автор статті користуюся ОС Linux Ubuntu. А в операційній системі Ubuntu, Linux Python встановлений за замовчуванням. Причому як 2 -га, так і 3 -тя версії. Для перевірки наявності 3 -ої версії в терміналі потрібно виконати команду python3. Використовуватиму новішу версію, сьогодні всі рекомендують розпочинати вивчення мови програмування Python саме з 3 -ої версії. Старі версії поки що ще підтримуються використовують, тільки для підтримки застарілого коду.
Поява трьох стрілок внизу свідчить, що запущений сеанс інтерпретатора. Зараз він мені не потрібен, для виходу з нього клацаю Exit () і Enter.
2. Для створення проекту автотесту та підключення потрібних бібліотек в Python використовують Pip (система управління пакетами) і virtualenv (з його допомогою створюють віртуальні оточення з пакетами (бібліотеками), для окремих проектів, щоб не встановлювати той самий Selenium глобально, а встановити його в папці з проектом для автотесту). В Ubuntu ці інструменти вже встановлені, якщо у Вас також, можете перевірити версію:
Ви без проблем можете пошукати інструкції інсталювання в інтернеті, там все дуже просто на кілька команд в терміналі. Спочатку ставиться pip, а потім з його допомогою virtualenv.
Переходимо до створення простого проекту для тесту:
1. Створюємо папку first_test потім заходимо в неї:
2. Усередині цієї папки за допомогою virtualenv створюємо віртуальне оточення з назвою env_test:
create-env-virtualenv
3. Для початку роботи у віртуальному середовищі потрібно його активувати. Робиться це за допомогою команди source env_test/bin/activate. Якщо Ви назвали Ваше віртуальне оточення інакше, ніж env_test, то підставте цю назву в команду замість тієї що на скріншоті:
Поява спочатку рядка в терміналі напису в дужках (env_test) говорить нам про те, що віртуальне оточення Python активоване.
4. Перебуваючи всередині активного віртуального оточення Python за допомогою pip встановлюємо всередині проекту Selenium. Командою pip install selenium:
5. Для перевірки встановлених у віртуальному оточенні пакетів можна виконати команду pip list:
Як видно на скріншоті, встановлено 4 пакети, серед яких є потрібний нам Selenium. Три інших пакети були встановлені автоматично, під час створення віртуального оточення (вони не мають відношення конкретно до тестів). Якщо вийти з віртуального оточення і виконати команду pip list, то список пакетів у буде значно більший. А у віртуальному оточенні на даний момент знаходиться все потрібне для написання тестів.
Отже, можна розпочинати писати сам автотест на Python:
Запускаю cвій PyCharm (IDE середовище розробки, типу редактора коду для мови Python) і в ньому просто відкриваю папку first_test:
Всередині міститься директорія з віртуальним середовищем — env_test. Звісно створювати папку проекту й віртуального середовища можна не тільки через термінал, але й шляхом створення усередині самого середовища IDE.
Також усередині проекту створюємо папку tests, у якій зберігатимемо модулі python з автотестами. Тестувати ми будемо разом з Вами форму логування з паролем пошти ukrnet. Для нашого коду тесту створюємо в папці tests файл (модуль) python і називаю його login_test:
Для Юніт тестів мені знадобиться підключення бібліотеки unittest.
Робиться це рядком:
import unittest
Пакет Unittest бібліотеки входить до складу Python за замовчуванням, тому не було необхідності встановлювати його через pip в віртуальне оточення.
Далі з пакета Selenium імпортуємо модуль webdriver:
from selenium import webdriver
Створюємо клас LoginTest і наслідуємо його від класу TestCase з Python бібліотеки unittest. Це необхідно, щоб Python розумів як працювати з нашими тестами:
class LoginTest(unittest.TestCase):
В Python для наслідування від іншого класу потрібно під час оголошення класу вказати ім’я батьківського класу в дужках.
LoginTest буде містити в собі три методи. Визначення методів в Python починається зі слова def:
- setup ()
- test_user_login ()
- tear_down ()
setup () і tear_down () в unittest виконують роль службових методів і викликатимуться автоматично, перед і після кожного тесту в модулі, що запускається. Імена тестових методів повинні починатися з префікса test_, щоб unittest зміг знайти їх під час запуску. В нашому модулі тестовий метод один test_user_login ().
Код методу setup ():
def setUp(self): self.driver = webdriver.Chrome(executable_path='/home/user/drivers/chromedriver') self.driver.maximize_window() self.driver.implicitly_wait(10)
У цьому методі відбувається створення екземпляра WebDriver, а також його налаштування. Задаємо тайм-аут, розгортаємо вікно браузеру.
executable_path = '/home/user/drivers/chromedriver'
— це шлях до драйвера браузера Chrome, який попередньо слід завантажити і розпакувати в папку drivers. Посилання для завантаження ТУТ.
Параметр self в методі є обов’язковим при визначенні методів в класі. Параметр self повинен передувати всім іншим параметрам методу. self містить e собі посилання на екземпляр класу і буде автоматично передаватися при кожному виклику методу пов’язаного з класом. Змінні з префіксом self доступні всім методам в класі.
Код методу tear_down ():
def tear_down(self): self.driver.quit()
Цей метод закриває всі активні вікна браузера і завершує його роботу.
Код нашого єдиного тестового методу test_user_login ():
def test_user_login(self): driver = self.driver driver.get("https://mail.ukr.net/desktop/login") login_field = driver.find_element_by_id("id-1") login_field.send_keys("autotestorgua") password_field = driver.find_element_by_id("id-2") password_field.send_keys("testpass") button_login = driver.find_element_by_xpath("//*[text()='Увійти']") button_login.click() user_mail = driver.find_element_by_xpath("//*[@class='login-button__user']") assert user_mail.text == "autotestorgua@ukr.net"
На що варто звернути увагу:
driver = self.driver #створення локальної змінної з посиланням на екземпляр WebDriver, який був створений в методі setUp ()
Розглянемо деякі дії під час тесту:
-
-
login_field = driver.find_element_by_id("id-1") #пошук елемента (в даному випадку по id)
-
login_field.send_keys("autotestorgua") #введення тексту в елемент
-
- button_login.click () #натискання на елемент
-
assert user_mail.text == "autotestorgua@ukr.net" #тут порівнюємо отриманий з елемента текст з очікуваним для перевірки, що авторизація пройшла успішно
Весь код тестового модуля:
import unittest from selenium import webdriver class LoginMailBox(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path='/home/user/drivers/chromedriver') self.driver.implicitly_wait(10) def test_user_login_in_mail_box(self): driver = self.driver driver.get("https://mail.ukr.net/desktop/login") login_field = driver.find_element_by_id("id-1") login_field.send_keys("autotestorgua") password_field = driver.find_element_by_id("id-2") password_field.send_keys("testpass") button_login = driver.find_element_by_xpath("//*[text()='Увійти']") button_login.click() user_mail = driver.find_element_by_xpath("//*[@class='login-button__user']") assert user_mail.text == "au" def tear_down(self): self.driver.quit() if __name__ == "__main__": unittest.main()
Зверніть увагу на останні два рядки, вони обов’язкові для запуску тестів з командного рядка (якщо запускати тест з середовища розробки, то вони не потрібні 🙂
if __name__ == “__main__”: перевіряє, що модуль запущений як основна програма, а не як модуль імпортований в інший скрипт. І якщо if поверне true, то буде виконана наступна команда:
unittest.main() надає інтерфейс для запуску тестового модуля з командного рядка. Коли Ви викликаєте в терміналі команди python login_test.py інтерпретатору буде наказано виконати всі тести з зазначеного модуля.
Переходимо до запуску автотесту:
Найпростіший спосіб це з середовища розробки за допомогою клавіш Shift + F10:
Знизу можна побачити підсумок. Тест пройдений! Ура!
Наступний спосіб — це запуск з терміналу. Перебуваючи в директорії з тестами (у нашому випадку tests) набираємо команду виконати:
python login_test.py
Результат не забариться себе чекати:
Все ОК. Зверніть увагу, що автотести потрібно запускати тільки в активованому оточенні (env_test) про що попереджено з самого початку. Інакше автоматизовані тести не запустяться.
Додам, запуск автотесту з терміналу і деталізація виведення результатів не обмежуються даними способом. Про це вже в наступних постах….
Ось такий вийшов експеримент з написанням автотеста Selenium WebDriver на Python. Пробуйте покроково як на скріншотах. У Вас все вийде. Ми в Вас віримо!
Посилання на завантаження chromedriver відсутнє. Напевне мався на увазі цей лінк https://sites.google.com/a/chromium.org/chromedriver/
Дякі.
https://github.com/mozilla/geckodriver/releases/ для Firefox