Справочник плагина Pytest
Введение
Playwright предоставляет плагин Pytest для написания end-to-end тестов. Чтобы начать работу с ним, обратитесь к руководству по началу работы.
Использование
Для запуска ваших тестов используйте CLI Pytest.
pytest --browser webkit --headed
Если вы хотите добавить аргументы CLI автоматически, не указывая их, вы можете использовать файл pytest.ini:
# содержимое pytest.ini
[pytest]
# Запуск firefox с UI
addopts = --headed --browser firefox
Аргументы CLI
Обратите внимание, что аргументы CLI применяются только к стандартным фикстурам browser, context и page. Если вы создаете браузер, контекст или страницу с помощью вызова API, например browser.new_context(), аргументы CLI не применяются.
--headed: Запуск тестов в режиме с интерфейсом (по умолчанию: без интерфейса).--browser: Запуск тестов в другом браузереchromium,firefoxилиwebkit. Может быть указан несколько раз (по умолчанию:chromium).--browser-channelКанал браузера, который будет использоваться.--slowmoЗамедляет операции Playwright на указанное количество миллисекунд. Полезно, чтобы увидеть, что происходит (по умолчанию: 0).--deviceУстройство, которое будет эмулироваться.--outputДиректория для артефактов, созданных тестами (по умолчанию:test-results).--tracingЗаписывать ли трассировку для каждого теста.on,offилиretain-on-failure(по умолчанию:off).--videoЗаписывать ли видео для каждого теста.on,offилиretain-on-failure(по умолчанию:off).--screenshotАвтоматически ли делать скриншот после каждого теста.on,offилиonly-on-failure(по умолчанию:off).--full-page-screenshotДелать ли скриншот всей страницы при ошибке. По умолчанию захватывается только видимая область. Требует включения--screenshot(по умолчанию:off).
Фикстуры
Этот плагин настраивает специфичные для Playwright фикстуры для pytest. Чтобы использовать эти фикстуры, используйте имя фикстуры в качестве аргумента для тестовой функции.
def test_my_app_is_working(fixture_name):
pass
# Тест с использованием fixture_name
# ...
Область действия функции: Эти фикстуры создаются при запросе в тестовой функции и уничтожаются, когда тест завершается.
context: Новый контекст браузера для теста.page: Новая страница браузера для теста.new_context: Позволяет создавать разные контексты браузера для теста. Полезно для сценариев с несколькими пользователями. Принимает те же параметры, что и browser.new_context().
Область действия сессии: Эти фикстуры создаются при запросе в тестовой функции и уничтожаются, когда все тесты завершаются.
playwright: Экземпляр Playwright.browser_type: Экземпляр BrowserType текущего браузера.browser: Экземпляр Browser, запущенный Playwright.browser_name: Имя браузера в виде строки.browser_channel: Канал браузера в виде строки.is_chromium,is_webkit,is_firefox: Булевы значения для соответствующих типов браузеров.
Настройка параметров фикстур: Для фикстур browser и context используйте следующие фикстуры для определения пользовательских параметров запуска.
browser_type_launch_args: Переопределяет аргументы запуска для browser_type.launch(). Должен возвращать Dict.browser_context_args: Переопределяет параметры для browser.new_context(). Должен возвращать Dict.
Также возможно переопределить параметры контекста (browser.new_context()) для одного теста, используя маркер browser_context_args:
import pytest
@pytest.mark.browser_context_args(timezone_id="Europe/Berlin", locale="en-GB")
def test_browser_context_args(page):
assert page.evaluate("window.navigator.userAgent") == "Europe/Berlin"
assert page.evaluate("window.navigator.languages") == ["de-DE"]
Параллелизм: Запуск нескольких тестов одновременно
Если ваши тесты выполняются на машине с большим количеством процессоров, вы можете ускорить общее время выполнения вашего набора тестов, используя pytest-xdist для одновременного запуска нескольких тестов:
# установка зависимости
pip install pytest-xdist
# использование флага --numprocesses
pytest --numprocesses auto
В зависимости от оборудования и характера ваших тестов, вы можете установить numprocesses от 2 до количества процессоров на машине. Если установить слишком высокое значение, вы можете заметить непредвиденное поведение.
Смотрите Запуск тестов для общей информации о параметрах pytest.
Примеры
Настройка типов для автозаполнения
from playwright.sync_api import Page
def test_visit_admin_dashboard(page: Page):
page.goto("/admin")
# ...
Если вы используете VSCode с Pylance, эти типы могут быть выведены автоматически, включив настройку python.testing.pytestEnabled, чтобы вам не нужно было указывать аннотацию типа.
Использование нескольких контекстов
Чтобы симулировать нескольких пользователей, вы можете создать несколько экземпляров BrowserContext.
from playwright.sync_api import Page, BrowserContext
from pytest_playwright.pytest_playwright import CreateContextCallback
def test_foo(page: Page, new_context: CreateContextCallback) -> None:
page.goto("https://example.com")
context = new_context()
page2 = context.new_page()
# page и page2 находятся в разных контекстах
Пропуск теста для определенного браузера
import pytest
@pytest.mark.skip_browser("firefox")
def test_visit_example(page):
page.goto("https://example.com")
# ...
Запуск на конкретном браузере
import pytest
@pytest.mark.only_browser("chromium")
def test_visit_example(page):
page.goto("https://example.com")
# ...
Запуск с использованием пользовательского канала браузера, например, Google Chrome или Microsoft Edge
pytest --browser-channel chrome
def test_example(page):
page.goto("https://example.com")
Настройка базового URL
Запустите Pytest с аргументом base-url. Для этого используется плагин pytest-base-url, который позволяет установить базовый URL из конфигурации, аргумента CLI или как фикстуру.
pytest --base-url http://localhost:8080
def test_visit_example(page):
page.goto("/admin")
# -> Результат будет http://localhost:8080/admin
Игнорирование ошибок HTTPS
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"ignore_https_errors": True
}
Использование пользовательского размера окна просмотра
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
return {
**browser_context_args,
"viewport": {
"width": 1920,
"height": 1080,
}
}
Эмуляция устройства / Переопределение параметров BrowserContext
import pytest
@pytest.fixture(scope="session")
def browser_context_args(browser_context_args, playwright):
iphone_11 = playwright.devices['iPhone 11 Pro']
return {
**browser_context_args,
**iphone_11,
}
Или через CLI --device="iPhone 11 Pro"
Использование с unittest.TestCase
Смотрите следующий пример для использования с unittest.TestCase. Это имеет ограничение, что может быть указан только один браузер, и не создается матрица из нескольких браузеров при указании нескольких.
import pytest
import unittest
from playwright.sync_api import Page
class MyTest(unittest.TestCase):
@pytest.fixture(autouse=True)
def setup(self, page: Page):
self.page = page
def test_foobar(self):
self.page.goto("https://microsoft.com")
self.page.locator("#foobar").click()
assert self.page.evaluate("1 + 1") == 2
Отладка
Использование с pdb
Используйте оператор breakpoint() в вашем тестовом коде, чтобы приостановить выполнение и получить REPL pdb.
def test_bing_is_working(page):
page.goto("https://bing.com")
breakpoint()
# ...
Развертывание в CI
Смотрите руководства для провайдеров CI, чтобы развернуть ваши тесты в CI/CD.
Асинхронные фикстуры
Если вы хотите использовать асинхронные фикстуры, вы можете использовать плагин pytest-playwright-asyncio. Убедитесь, что используете pytest-asyncio>=0.24.0 и ваши тесты используют loop_scope=session.
import pytest
from playwright.async_api import Page
@pytest.mark.asyncio(loop_scope="session")
async def test_foo(page: Page):
await page.goto("https://github.com")
# ...