Вызов фикстуры к отдельным тестам
Добавляю фикстуру и все тесты валятся, думаю это из-за того, что первый тест проверяет главную страницу и ему не нужно возвращаться назад, после этого открывается после белая страница и дальнейшие тесты падают, есть какой-то способ запускать эту фикстуру только на нужных тестах?
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 шт):
Один вариант решить эту конкретную проблему - создать две разные зависимые фикстуры:
@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