Вызов фикстуры к отдельным тестам

Добавляю фикстуру и все тесты валятся, думаю это из-за того, что первый тест проверяет главную страницу и ему не нужно возвращаться назад, после этого открывается после белая страница и дальнейшие тесты падают, есть какой-то способ запускать эту фикстуру только на нужных тестах?

from ATPages import SearchHelper 
import requests
import pytest

@pytest.fixture
def browser(browser):
    try:
        yield browser
    finally:
        browser.back()

#Проверка главной страницы расширения
def test_main(browser):
    main_page = SearchHelper(browser)
    main_page.go_to_site()
    response = requests.head(browser.current_url)
    assert response.status_code == 200

#Открываем коллекцию горячей подборки
def test_collection1(browser):
    main_page = SearchHelper(browser)
    #window_before = browser.window_handles[0]   #Запоминаем предыдущую страницу
    main_page.click_button_collection1()
    #window_after = browser.window_handles[1]     #Запоминаем новую страницу
    #browser.switch_to.window(window_after)       #Перемещаемся на новую страницу
    response = requests.head(browser.current_url)
    assert response.status_code == 200

#Клик на фильтр
def test_filter(browser):
    main_page = SearchHelper(browser)
    main_page.click_button_filter()
    main_page.click_dropdown_menu()
    response = requests.head(browser.current_url)
    assert response.status_code == 200
    browser.back()

#Бестселлеры
def test_collection2(browser):
    main_page = SearchHelper(browser)
    main_page.click_button_collection2()
    response = requests.head(browser.current_url)
    assert response.status_code == 200
    browser.back()

#Покупатели рекомендуют
def test_collection3(browser):
    main_page = SearchHelper(browser)
    main_page.click_button_collection3()
    response = requests.head(browser.current_url)
    assert response.status_code == 200
    browser.back()

Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Один вариант решить эту конкретную проблему - создать две разные зависимые фикстуры:

@pytest.fixture
def returning_browser(browser):
    try:
        yield browser
    finally:
        browser.back()

# тест в котором нужно возвращаться
def test_some(returning_browser):
    main_page = SearchHelper(returning_browser)
    ...
    

# тест в котором не нужно возвращаться
def test_some(browser):
    main_page = SearchHelper(browser)
    ...

Но у нас все равно будет глобальная проблема. Пока все хорошо и тесты проходят - все работает. Проблема заключается в том, что если в тесте где-то случится ошибка, то возвращаться или нет на предыдущую страницу зависит от того, где эта ошибка в тесте случилась. То есть неясно успел тест перейти на другую страницу или нет.

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

Решение такое, что нужно перед запуском теста приводить состояние к известному. Например, перезапускать браузер с нуля. Или всегда открывать начальную страницу. Тогда в конце теста нет необходимости делать back, лучше и правильней вначале тесте делать переход на начальную страницу:

@pytest.fixture
def browser(browser):
   browser.get("/some/main/page")
   yield browser
→ Ссылка