Как проверить запуск тестов в разных браузерах, например Firefox
Что проверяют
Умеете ли вы запускать один и тот же набор тестов в нескольких браузерах без копирования кода. Следом обычно спрашивают, как это распараллелить и где тесты бегают в CI.
Как отвечать
Главная мысль: браузер это параметр запуска, а не часть теста. В pytest это делается фикстурой с параметрами:
@pytest.fixture(params=["chrome", "firefox"])
def driver(request):
if request.param == "firefox":
opts = webdriver.FirefoxOptions()
opts.add_argument("-headless")
drv = webdriver.Firefox(options=opts)
else:
drv = webdriver.Chrome()
yield drv
drv.quit()Каждый тест с этой фикстурой прогонится дважды, а в отчёте будет видно, в каком браузере он упал. Чтобы выбирать браузер из командной строки, заводят свою опцию через pytest_addoption в conftest.py.
Детали, которые стоит назвать:
- драйверы: начиная с Selenium 4.6 geckodriver и chromedriver скачивает встроенный Selenium Manager, путь через
Serviceуказывать не нужно; - CI и параллельность: Selenium Grid или контейнеры
selenium/standalone-firefox, подключение черезwebdriver.Remote(command_executor=..., options=...). Параллельный прогон даётpytest-xdistс-n auto; - Playwright: плагин
pytest-playwrightпринимает--browser firefox, флаг можно повторить для нескольких браузеров. Firefox там собственная сборка с патчами, а не тот, что стоит у пользователей; - ожидания: явные
WebDriverWaitвместоtime.sleep, иначе в более медленном браузере тесты начнут падать случайно.
Отличия, которые реально всплывают в Firefox: поля даты, загрузка файлов, обработка клавиатуры и фокуса, шрифты и рендер в скриншотных тестах.
Где спотыкаются
Дублируют тесты под каждый браузер вместо параметризации. Через месяц копии расходятся.
Прописывают жёсткий путь к geckodriver из устаревших примеров. На другой машине и в CI это ломается, а Selenium Manager решает задачу сам.
Списывают нестабильность в Firefox на «особенности браузера». Чаще причина в отсутствии явных ожиданий и в локаторах, которые в Chrome успевали сработать случайно.