Хочу установить параметры командной строки которые, в зависимости от запуска, вызывали разные браузеры. Но не получается, прочитал про добавление фикстур - https://docs.pytest.org/en/latest/example/simple.html , но не получается, при использовании структуры
примерно такой + файлик conftest.py как в документации
class Test_1:
def test_answer(cmdopt):
pass
def test_answer1(cmdopt):
pass
При использовании класса, он вызывает вот такой объект -
cmdopt = <test_sample.Test_a object at 0x10d262c50>, а не “type” прописаный в фикстурах
Подскажите, как правильно настроить фикстуру.
Или, если возможно, грамотно прописать в Environment variables
Подскажите идеи, спасибо
Функу и фикстуру надо добавить в conftest.py
Сначала надо добавить функу на кастомные ключи:
def pytest_addoption(parser):
"""
Метод добавляет кастомные ключи в запуск тестов
Ключи:
--browser: chrome/firefox - браузер для тестирования
:param parser: парсер ключей pytest
"""
parser.addoption('--browser', action='store',
default='chrome')
Затем написать фикстуру получения экземпляра класса вебдрайвера:
@pytest.fixture()
def web_driver(request):
"""
Инициализация веб драйвера в зависимости от ключа "--browser"
:return: объект класса webdriver
"""
browser = request.config.getoption('--browser')
driver_name = dict(
firefox='geckodriver',
chrome='chromedriver'
)[browser]
driver_path = path.join(drivers_dir, driver_name)
if browser == 'firefox':
driver = webdriver.Firefox(executable_path=driver_path,
log_path=log_path,
firefox_options=ff_opts)
elif browser == 'chrome':
driver = webdriver.Chrome(executable_path=driver_path,
service_log_path=log_path,
chrome_options=ch_opts)
driver.delete_all_cookies()
def driver_finalizer():
driver.quit()
request.addfinalizer(driver_finalizer)
return driver
Далее вам необходимо использовать эту фикстуру в тесте чтобы получить вебдрайвер нужного браузера
В консоли вызов будет:
pytest --browser=chrome
pytest --browser=firefox
PS: Я там повырезал в коде много строк чтобы была понятнее суть. Так что не спрашивайте что там за переменные неопределенные)
UPD: Вообще в тесты получать через фикстуру вебдрайвер - не комильфо, я лично создаю фикстуру на быстрые переходы по страницам и сразу кидаю оъект страницы в тест тем самым цепочкой фикстур подготавливая стенд:
@pytest.fixture()
def login_page(web_driver) -> LoginPage:
"""
Фикстура для быстрого перехода на страницу авторизации
:param web_driver: фикстура инициализации веб драйвера
:return: экземпляр класса LoginPage
"""
page = LoginPage(web_driver)
page.navigate()
return page
**
При этом получаю ошибку simple.py:39: no docstring available
И еще вопрос, фикчу надо прописывать на каждый тестовый метод (и передавать ее в параметры), или можно навесить на тестовый класс ?
Немного подробнее изучил вопрос касаемо классового скоупа, есть хорошая статья:
Написав достаточно большое количество тестов в pytest у меня не разу не было потребности в создании класса для тестов и подозреваю что это делается для кастомных сетапов и тирдаунов. Какие еще есть плюсы в создании классов?
Подозреваю, что возможность работы с классами была добавлена как обратная совместимость с class based тестами на unittest, и чтобы малой кровью можно было обойтись и не рефакторить всю ту же логику, перетаскивая методы в модульный скоуп