Как написать проект по автоматизации на Python, Pytest и Playwright и настроить запуск автотестов в CI с нуля
В этом разделе я покажу, как написать автотест для авторизации на сайте-песочнице https://www.saucedemo.com. (А в следующем разделе мы сделаем метод авторизации фикстурой, чтобы в дальнейшем использовать ее перед запуском других автотестов).
Для начала создайте следующие модули:
файл auth.py в папке Locators;
файл constants.py в папке data;
файл main_page.py в папке pages;
файл test_auth.py в папке Tests.
Нужно добавить префикс test_ в название файла, чтобы Pytest автоматически обнаруживал и выполнял функции в модуле как тестовые сценарии. Это связано с соглашениями и стандартами, которые использует Pytest для автоматического обнаружения тестов.
Теперь нужно в свежесозданном файле test_auth.py создать класс Auth и подобрать локаторы для формы авторизации. Откройте сайт-песочницу https://saucedemo.com, наведите мышку на поле инпута username и нажмите правую кнопку мыши. В появившемся окне выберите Просмотреть код.
У вас откроется панель разработчика на вкладке Elements с выделенной частью html-разметки для инпута Username.
Теперь нажмите command + F, чтобы открыть строку поиска по html-разметке страницы.
В этой статье в основном я буду завязываться на Data attributes, так как разработчики сайта их нам оставили. Вообще, Data attributes является самым лучшим вариантом для того, чтобы на них завязать автотесты: с ними легче добиться стабильности тестов, так как маловероятно, что они могут измениться.
Вообще, по возможности, я стараюсь следовать следующему приоритету локаторов:
На первом месте — Data attributes.
На втором — CSS-селекторы.
На третьем — XPath (использую при более сложных сценариях поиска, как один из примеров — если хочу привязаться к какому-то элементу по тексту).
После того, как вы нажали на command + F, у вас открылась строка поиска по html-разметке страницы. Введите в строке поиска data-test='username' — это и есть Data attribute. Нажмите Enter — и вы увидите, что элемент выделился.
Скопируйте его, затем создайте в своем файле test_auth.py и в созданном классе Auth новый атрибут USERNAME_INPUT = »[data-test='username']». Аналогично добавьте PASSWORD_INPUT и LOGIN_BTN.
Получиться должно так.
class Auth:
USERNAME_INPUT = "[data-test = 'username']"
PASSWORD_INPUT = "[data-test='password']"
LOGIN_BTN = "[data-test='login-button']"
Далее в файл constants.py добавьте код:
import os
class Constants:
try:
login = os.getenv('AUTH_LOGIN')
password = os.getenv('AUTH_PASSWORD')
except KeyError:
print("LOGIN OR PW WASN'T FOUND")
Это нужно, чтобы не хранить авторизационные креды в коде. Логин и пароль при запуске локально будет подтягиваться из файла .env, а при удаленном запуске — из папок secrets.
Значит, нужно добавить логин и пароль в файл .env:
AUTH_LOGIN = standard_user
AUTH_PASSWORD = secret_sauce
Теперь можно приступать к заполнению модуля main_page.py. Я расскажу, как написать метод, который будет производить авторизацию через форму авторизации.
Добавим следующий код:
from pages.base import Base
from data.constants import Constants
from Locators.auth import Auth
from data.assertions import Assertions
from playwright.sync_api import Page
class Main(Base):
def __init__(self, page: Page) -> None:
super().__init__(page)
self.assertion = Assertions(page)
def user_login(self):
self.open("")
self.input(Auth.USERNAME_INPUT, Constants.login)
self.input(Auth.PASSWORD_INPUT, Constants.password)
self.click(Auth.LOGIN_BTN)
self.assertion.check_URL("inventory.html", "Wrong URL")
В методе self.open (») передача » означает, что мы не передаем никакой дополнительный uri к базовому url. Другими словами, мы просто открываем базовый url — https://www.saucedemo.com.
В конце я также добавил проверку на то, что авторизация прошла успешно. Это именно пример, проверку можно сделать какую хотите.
Теперь, чтобы автотест запустился, нам нужно прописать его в модуле test_auth.py. Добавим следующий код:
import pytest
from pages.main_page import Main
@pytest.mark.smoke
class TestLogin:
def test_user_login(self, browser):
m = Main(browser)
m.user_login()
Этот тест помечен маркой smoke для того, чтобы разбить автотесты на разные блоки и, в зависимости от ситуации, прогонять нужные.
Также был создан экземпляр класса с главной фикстурой browser, а дальше вызван метод user_login () из модуля main_page.py.
Осталось только запустить автотест. Но для начала в терминале PyCharm нужно написать команду cd Tests, чтобы перейти в папку с тестовым модулем.
Теперь в терминале PyCharm напишите команду для запуска автотеста pytest -s test_auth.py и нажмите Enter. Флаг -s нам тут нужен для вывода дополнительной информации о выполнении тестов. Должен появиться статус PASSED, это означает, что тест прошел успешно.