Ошибка при передаче фикстуры в параметр функции

Рейтинг: 0Ответов: 1Опубликовано: 15.08.2023

Проблема при передаче в параметре фикстуры в функцию

Импорт и фикстура:

import  pytest
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture()
def browser():
   chrome_browser = webdriver.Chrome()
   chrome_browser.implicitly_wait(10)
   return chrome_browser

Функия, в которую передаю фикстуру, её вызов:

def check_Botton(browser):
    browser.get('https://www.qa-practice.com/elements/button/simple')
    browser.find_element(By.ID, 'submit-id-submit').click()
    assert browser.find_element(By.ID, 'result-text').is_displayed()


check_Botton(browser)

Ошибка:

    browser.get('https://www.qa-practice.com/elements/button/simple')
    ^^^^^^^^^^^
AttributeError: 'function' object has no attribute 'get'

Пробовал гуглить, вроде, корректно передаю. Пробовал передавать как check_Botton(browser()), так как передается функция, но возникает ошибка, отсылающая к документации:

    raise Failed(msg=reason, pytrace=pytrace)
Failed: Fixture "browser" called directly. Fixtures are not meant to be called directly,
but are created automatically when test functions request them as parameters.
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly about how to update your code.

Перепроверял вот таким образом, работает корректно:

def check_Botton():
    browser = webdriver.Chrome()
    browser.get('https://www.qa-practice.com/elements/button/simple')
    browser.find_element(By.ID, 'submit-id-submit').click()
    assert browser.find_element(By.ID, 'result-text').is_displayed()


check_Botton()

Ответы

▲ 1

Не нужно вызывать тестовую функцию явно, вообще не должно быть вызова check_Botton(browser) или check_Botton(browser()). Нужно запустить тесты через pytest, pytest выполнит фикстуру и подставит ее результат вместо параметра функции.

Чтобы pytest нашел тестовую функцию, её имя должно начинаться с test_.

Минимальный пример, selenium для демонстрации меняю на мок:

import pytest
from unittest.mock import MagicMock


@pytest.fixture()
def browser():
   chrome_browser = MagicMock()
   chrome_browser.get = MagicMock(return_value=123)
   return chrome_browser


def test_Botton(browser):
    assert browser.get() == 123

Запуск:

❯ pytest test.py
============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-6.2.5, py-1.10.0, pluggy-0.13.0
rootdir: /home/user/Projects
plugins: anyio-3.6.2, Faker-16.6.1, cov-4.1.0
collected 1 item                                                               

test.py .                                                                [100%]

============================== 1 passed in 0.07s ===============================