"""Модуль pages содержит фикстуры и функции для работы с Playwright.
Предоставляет инструменты для управления браузером, контекстами и страницами
в тестах pytest, включая настройку параметров запуска.
"""
import ast
import pytest
from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright, Playwright
from _pytest.config.argparsing import Parser
from _pytest.fixtures import FixtureRequest
[документация]
def pytest_addoption(parser: Parser):
"""Добавляет опции командной строки для настройки браузера.
Args:
parser: Парсер pytest для добавления опций.
Опции:
--bn: Браузер (chrome, remote_chrome, firefox)
--h: Режим headless (True/False)
--s: Размер окна {'width': int, 'height': int}
--slow: Задержка между действиями (мс)
--t: Таймаут по умолчанию (мс)
--l: Локаль браузера
"""
parser.addoption('--bn', action='store', default="chrome",
help="Choose browser: chrome, remote_chrome or firefox")
parser.addoption('--h', action='store', default=False,
help='Choose headless: True or False')
parser.addoption('--s', action='store', default="{'width': 1600, 'height': 900}",
help='Size window: width,height')
# Закомментированные альтернативные размеры окон
# parser.addoption('--s', action='store', default="{'width': 1920, 'height': 1080}",
# help='Size window: width,height')
# parser.addoption('--s', action='store', default="{'width': 1920, 'height': 300}",
# help='Size window: width,height')
# parser.addoption('--s', action='store', default="{'width': 300, 'height': 420}",
# help='Size window: width,height')
parser.addoption('--slow', action='store', default=200,
help='Choose slow_mo for robot action')
parser.addoption('--t', action='store', default=60000,
help='Choose timeout')
parser.addoption('--l', action='store', default='ru-RU',
help='Choose locale')
# Закомментированная опция для Qase
# parser.addini('qs_to_api_token', default=os.getenv("QASE_TOKEN"), help='Qase app token')
[документация]
@pytest.fixture(scope='class')
def browser(request: FixtureRequest) -> Page:
"""Фикстура для управления экземпляром браузера.
Args:
request: Объект запроса pytest для доступа к конфигурации.
Returns:
Page: Экземпляр страницы браузера.
Yields:
Page: Страница для использования в тестах.
Note:
Автоматически закрывает браузер после тестов.
"""
playwright = sync_playwright().start()
# Выбор браузера на основе параметра командной строки
if request.config.getoption("bn") == 'remote_chrome':
browser = get_remote_chrome(playwright, request)
context = get_context(browser, request, 'remote')
page_data = context.new_page()
elif request.config.getoption("bn") == 'firefox':
browser = get_firefox_browser(playwright, request)
context = get_context(browser, request, 'local')
page_data = context.new_page()
elif request.config.getoption("bn") == 'chrome':
browser = get_chrome_browser(playwright, request)
context = get_context(browser, request, 'local')
page_data = context.new_page()
else:
browser = get_chrome_browser(playwright, request)
context = get_context(browser, request, 'local')
page_data = context.new_page()
yield page_data
# Очистка после завершения тестов
for context in browser.contexts:
context.close()
browser.close()
playwright.stop()
[документация]
def get_firefox_browser(playwright: Playwright, request: FixtureRequest) -> Browser:
"""Создает и возвращает экземпляр Firefox браузера.
Args:
playwright: Экземпляр Playwright.
request: Объект запроса pytest.
Returns:
Browser: Экземпляр Firefox.
"""
return playwright.firefox.launch(
headless=request.config.getoption("h"),
slow_mo=request.config.getoption("slow"),
)
[документация]
def get_chrome_browser(playwright: Playwright, request: FixtureRequest) -> Browser:
"""Создает и возвращает экземпляр Chrome браузера.
Args:
playwright: Экземпляр Playwright.
request: Объект запроса pytest.
Returns:
Browser: Экземпляр Chrome.
"""
return playwright.chromium.launch(
headless=request.config.getoption("h"),
slow_mo=request.config.getoption("slow"),
args=['--s']
)
[документация]
def get_remote_chrome(playwright: Playwright, request: FixtureRequest) -> Browser:
"""Создает экземпляр Chrome для удаленного запуска.
Args:
playwright: Экземпляр Playwright.
request: Объект запроса pytest.
Returns:
Browser: Экземпляр Chrome в headless режиме.
"""
return playwright.chromium.launch(
headless=True,
slow_mo=request.config.getoption("slow")
)
[документация]
def get_context(browser: Browser, request: FixtureRequest, start: str) -> BrowserContext:
"""Создает и настраивает контекст браузера.
Args:
browser: Экземпляр браузера.
request: Объект запроса pytest.
start: Тип запуска ('local' или 'remote').
Returns:
BrowserContext: Настроенный контекст.
"""
if start == 'local':
# current_viewport = json.loads(request.config.getoption('--s'))
context = browser.new_context(
# no_viewport=True,
viewport= ast.literal_eval(request.config.getoption('--s')),
locale=request.config.getoption('l')
)
context.set_default_timeout(
timeout=request.config.getoption('t')
)
# Пример добавления кук (закомментировано)
# context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])
return context
elif start == 'remote':
context = browser.new_context(
viewport=ast.literal_eval(request.config.getoption('--s')),
locale=request.config.getoption('l')
)
context.set_default_timeout(
timeout=request.config.getoption('t')
)
# Пример добавления кук (закомментировано)
# context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])
return context
[документация]
@pytest.fixture(scope="function")
def return_back(browser: Page):
"""Фикстура для возврата на предыдущую страницу.
Args:
browser: Экземпляр страницы браузера.
"""
browser.go_back()