Ошибка при использовании в классе конструктора __init__

  1. Есть файл steps.py с таким содержанием:

class TheFirstStepOfRegistration:
“”“Первый шаг регистрации”""

def __init__(self, browser):
    self.browser = browser

def click_on_the_registration_button(self):
    """Клик по кнопке 'Регистрация'"""
    self.browser.find_element(*RegistrationLocators.BUTTON_REGISTRATION).click()
  1. Второй файл test_registration.py с таким содержанием:

class TestRegistrationOfAParticipantAsALegalEntity(TheFirstStepOfRegistration):

def test_registration_of_a_participant_as_a_legal_entity(self, browser):
    """Регистрации участника как юридическое лицо"""

    # Первый шаг регистрации
    self.click_on_the_registration_button()

Сам вопрос: при запуске через cmd появляется ошибка: PytestCollectionWarning: cannot collect test class ‘TestRegistrationOfAParticipantAsALegalEntity’ because it has a init constructor (from: test_registration.py)
class TestRegistrationOfAParticipantAsALegalEntity(TheFirstStepOfRegistration)
Гуглил, проблема в том что pytest не поддерживает конструктор init, но решения пока не нашёл.

Решений несколько:

  • Сделать браузер фикстурой
  • Внутри каждой тестовой функции создавать объект-браузер
  • Создавать классовую переменную browser = None вне инита, а затем в классовом методе setup_class записывать в переменную browser необходимый объект. Ну или сделать кастомную функцию set_browser(), добавить к ней декоратор classmethod и вызывать ее там, где нужно.

Почитайте про xunit в pytest, в общем :slight_smile:

Как-то так:

class BaseTest:
    browser = None

    @classmethod
    def setup_class(cls):
        """
        Setup method, called to set up each class before tests execution. Could be overridden/overloaded
        """
        cls.browser = Browser()

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

def setup_method(self, method):
    """setup any state tied to the execution of the given method in a
    class.  setup_method is invoked for every test method of a class.
    """

def setup_function(function):
    """setup any state tied to the execution of the given function.
    Invoked for every test function in the module.
    """

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

спасибо за ответы, использую фикстуру, с таким содержанием:

from selenium import webdriver
import pytest
from registration.API import *

@pytest.fixture
def browser():
options = webdriver.ChromeOptions()
options.add_extension(
r’C:\Users\User\AppData\Local\Google\Chrome\User Data\Default\Extensions\iifchhfnnmpdbibifmljnfjhpififfog\1.2.8_0\1.2.8_0.crx’) # Путь до упакованного расширения CryptoPro Extension for CAdES Browser Plug-in
browser = webdriver.Chrome(chrome_options=options)
browser.maximize_window()
browser.implicitly_wait(10)
browser.get(‘https://etp.losmetas.com/’)
yield browser
browser.quit()
remove_user()

Пока непонятно, буду дальше разбираться. Я просто пока не до конца понимаю паттерн проектирования автотестов - Page Object Model

Единственная проблема фикстуры - её нужно передавать в каждый тест аргументом, что очень неудобно. В моём случае у меня было бы 3 таких фикстуры, что меня сильно бесило

ну да, если была бы возможность фикстуру передавать в класс)