e-nms_qa_automation/fixtures/pages.py

182 lines
7.3 KiB
Python
Raw 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.

"""Модуль для работы с 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()