200 lines
7.5 KiB
Python
200 lines
7.5 KiB
Python
"""Модуль 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,
|
||
ignore_https_errors=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()
|