Skip to content

Browser Fixtures

Модуль pages содержит фикстуры и функции для работы с Playwright.

Предоставляет инструменты для управления браузером, контекстами и страницами в тестах pytest, включая настройку параметров запуска.

browser(request)

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

Parameters:

Name Type Description Default
request FixtureRequest

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

required

Returns:

Name Type Description
Page Page

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

Yields:

Name Type Description
Page Page

Страница для использования в тестах.

Note

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

Source code in fixtures\pages.py
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
87
88
89
90
91
92
93
94
95
@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()

get_chrome_browser(playwright, request)

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

Parameters:

Name Type Description Default
playwright Playwright

Экземпляр Playwright.

required
request FixtureRequest

Объект запроса pytest.

required

Returns:

Name Type Description
Browser Browser

Экземпляр Chrome.

Source code in fixtures\pages.py
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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']
    )

get_context(browser, request, start)

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

Parameters:

Name Type Description Default
browser Browser

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

required
request FixtureRequest

Объект запроса pytest.

required
start str

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

required

Returns:

Name Type Description
BrowserContext BrowserContext

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

Source code in fixtures\pages.py
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
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,
            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

get_firefox_browser(playwright, request)

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

Parameters:

Name Type Description Default
playwright Playwright

Экземпляр Playwright.

required
request FixtureRequest

Объект запроса pytest.

required

Returns:

Name Type Description
Browser Browser

Экземпляр Firefox.

Source code in fixtures\pages.py
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
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"),
    )

get_remote_chrome(playwright, request)

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

Parameters:

Name Type Description Default
playwright Playwright

Экземпляр Playwright.

required
request FixtureRequest

Объект запроса pytest.

required

Returns:

Name Type Description
Browser Browser

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

Source code in fixtures\pages.py
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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")
    )

pytest_addoption(parser)

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

Parameters:

Name Type Description Default
parser Parser

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

required
Опции

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

Source code in fixtures\pages.py
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
40
41
42
43
44
45
46
47
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': 1200, 'height': 500}",
                   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')

return_back(browser)

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

Parameters:

Name Type Description Default
browser Page

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

required
Source code in fixtures\pages.py
190
191
192
193
194
195
196
197
198
@pytest.fixture(scope="function")
def return_back(browser: Page):
    """Фикстура для возврата на предыдущую страницу.

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

    browser.go_back()