Skip to content

Browser Fixtures

Модуль для работы с Playwright в тестах pytest.

Содержит фикстуры и вспомогательные функции для управления браузером.

browser(request)

Фикстура для создания и управления экземпляром браузера.

Parameters:

Name Type Description Default
request

Объект запроса pytest для доступа к конфигурации.

required

Returns:

Name Type Description
Page Page

Экземпляр страницы браузера.

Yields:

Name Type Description
Page Page

Экземпляр страницы для использования в тестах.

Note

Автоматически закрывает браузер и контексты после завершения тестов.

Source code in fixtures\pages.py
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
@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()

get_chrome_browser(playwright, request)

Создает и возвращает экземпляр Chrome браузера.

Parameters:

Name Type Description Default
playwright

Экземпляр Playwright.

required
request

Объект запроса pytest для доступа к конфигурации.

required

Returns:

Name Type Description
Browser Browser

Экземпляр Chrome браузера.

Source code in fixtures\pages.py
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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']
    )

get_context(browser, request, start)

Создает и настраивает контекст браузера.

Parameters:

Name Type Description Default
browser

Экземпляр браузера.

required
request

Объект запроса pytest для доступа к конфигурации.

required
start

Тип запуска ('local' или 'remote').

required

Returns:

Name Type Description
BrowserContext BrowserContext

Настроенный контекст браузера.

Source code in fixtures\pages.py
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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

get_firefox_browser(playwright, request)

Создает и возвращает экземпляр Firefox браузера.

Parameters:

Name Type Description Default
playwright

Экземпляр Playwright.

required
request

Объект запроса pytest для доступа к конфигурации.

required

Returns:

Name Type Description
Browser Browser

Экземпляр Firefox браузера.

Source code in fixtures\pages.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
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"),
    )

get_remote_chrome(playwright, request)

Создает и возвращает экземпляр Chrome браузера для удаленного запуска.

Parameters:

Name Type Description Default
playwright

Экземпляр Playwright.

required
request

Объект запроса pytest для доступа к конфигурации.

required

Returns:

Name Type Description
Browser Browser

Экземпляр Chrome браузера в режиме headless.

Source code in fixtures\pages.py
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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")
    )

pytest_addoption(parser)

Добавляет пользовательские опции командной строки для настройки браузера.

Parameters:

Name Type Description Default
parser

Парсер pytest для добавления опций.

required
Доступные опции

--bn: Выбор браузера (chrome, remote_chrome или firefox) --h: Режим headless (True/False) --s: Размер окна в формате {'width': int, 'height': int} --slow: Задержка между действиями (slow_mo) --t: Таймаут по умолчанию (мс) --l: Локаль браузера

Source code in fixtures\pages.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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')

return_back(browser)

Фикстура для возврата на предыдущую страницу в браузере.

Parameters:

Name Type Description Default
browser

Экземпляр страницы браузера.

required
Source code in fixtures\pages.py
175
176
177
178
179
180
181
182
@pytest.fixture(scope="function")
def return_back(browser):
    """Фикстура для возврата на предыдущую страницу в браузере.

    Args:
        browser: Экземпляр страницы браузера.
    """
    browser.go_back()