e-nms_qa_automation/fixtures/pages.py

200 lines
7.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""Модуль 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()