Как написать проект по автоматизации на 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 для автоматического обнаружения тестов.

db05130bea626101c865392515ad00f0.png

Теперь нужно в свежесозданном файле test_auth.py создать класс Auth и подобрать локаторы для формы авторизации. Откройте сайт-песочницу https://saucedemo.com, наведите мышку на поле инпута username и нажмите правую кнопку мыши. В появившемся окне выберите Просмотреть код.

У вас откроется панель разработчика на вкладке Elements с выделенной частью html-разметки для инпута Username.

9d69f74a39d0f806a72b6ef57cfc695e.png

Теперь нажмите 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']"

8e43e96f46daf873bb75909a43082da8.png

Далее в файл 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")

c914f78977b23cb4c0e1ec49c8c72c73.png

Это нужно, чтобы не хранить авторизационные креды в коде. Логин и пароль при запуске локально будет подтягиваться из файла .env, а при удаленном запуске — из папок secrets. 

Значит, нужно добавить логин и пароль в файл .env:

AUTH_LOGIN = standard_user
AUTH_PASSWORD = secret_sauce

da7b065c0e1e0b1bca92bc3536d4ab3a.png

Теперь можно приступать к заполнению модуля 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")

f19b64f66110335d11aae6bc681ecf6e.png

В методе 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()

8908fc5d63ca630f3c911f7a7d3e7f54.png

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

Также был создан экземпляр класса с главной фикстурой browser, а дальше вызван метод user_login () из модуля main_page.py

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

8cbf2c3d151a8b1b357ca6bdbb44ee0f.png

Теперь в терминале PyCharm напишите команду для запуска автотеста pytest -s test_auth.py и нажмите Enter. Флаг -s нам тут нужен для вывода дополнительной информации о выполнении тестов. Должен появиться статус PASSED, это означает, что тест прошел успешно.

a72743ce0d1a859572d822848d1f41c0.png

© Habrahabr.ru