182 lines
7.3 KiB
Python
182 lines
7.3 KiB
Python
"""Модуль для работы с Playwright в тестах pytest.
|
||
|
||
Содержит фикстуры и вспомогательные функции для управления браузером.
|
||
"""
|
||
|
||
import pytest
|
||
from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright
|
||
import os
|
||
|
||
|
||
def pytest_addoption(parser):
|
||
"""Добавляет пользовательские опции командной строки для настройки браузера.
|
||
|
||
Args:
|
||
parser: Парсер pytest для добавления опций.
|
||
|
||
Доступные опции:
|
||
--bn: Выбор браузера (chrome, remote_chrome или firefox)
|
||
--h: Режим headless (True/False)
|
||
--s: Размер окна в формате {'width': int, 'height': int}
|
||
--slow: Задержка между действиями (slow_mo)
|
||
--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('--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) -> 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, request) -> 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, request) -> 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, request) -> 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, request, start) -> BrowserContext:
|
||
"""Создает и настраивает контекст браузера.
|
||
|
||
Args:
|
||
browser: Экземпляр браузера.
|
||
request: Объект запроса pytest для доступа к конфигурации.
|
||
start: Тип запуска ('local' или 'remote').
|
||
|
||
Returns:
|
||
BrowserContext: Настроенный контекст браузера.
|
||
"""
|
||
if start == 'local':
|
||
context = browser.new_context(
|
||
# no_viewport=True,
|
||
viewport=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=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):
|
||
"""Фикстура для возврата на предыдущую страницу в браузере.
|
||
|
||
Args:
|
||
browser: Экземпляр страницы браузера.
|
||
"""
|
||
browser.go_back() |