Skip to main content

A pytest wrapper with fixtures for Playwright to automate web browsers

Project description

Pytest plugin for Playwright PyPI

Write end-to-end tests for your web apps with Playwright and pytest.

  • Support for all modern browsers including Chromium, WebKit and Firefox.
  • Support for headless and headed execution.
  • Built-in fixtures that provide browser primitives to test functions.

Usage

pip install pytest-playwright

Use the page fixture to write a basic test. See more examples.

# test_my_application.py
def test_example_is_working(page):
    page.goto("https://example.com")
    assert page.inner_text('h1') == 'Example Domain'
    page.click("text=More information")

To run your tests, use pytest CLI.

# Run tests (Chromium and headless by default)
pytest

# Run tests in headed mode
pytest --headed

# Run tests in a different browser (chromium, firefox, webkit)
pytest --browser firefox

# Run tests in multiple browsers
pytest --browser chromium --browser webkit

If you want to add the CLI arguments automatically without specifying them, you can use the pytest.ini file:

# content of pytest.ini
[pytest]
# Run firefox with UI
addopts = --headed --browser firefox

Fixtures

This plugin configures Playwright-specific fixtures for pytest. To use these fixtures, use the fixture name as an argument to the test function.

def test_my_app_is_working(fixture_name):
    # Test using fixture_name
    # ...

Function scope: These fixtures are created when requested in a test function and destroyed when the test ends.

Session scope: These fixtures are created when requested in a test function and destroyed when all tests end.

  • browser: Browser instance launched by Playwright.
  • browser_name: Browser name as string.
  • is_chromium, is_webkit, is_firefox: Booleans for the respective browser types.

Customizing fixture options: For browser and context fixtures, use the the following fixtures to define custom launch options.

Examples

Configure Mypy typings for auto-completion

# test_my_application.py
from playwright.sync_api import Page

def test_visit_admin_dashboard(page: Page):
    page.goto("/admin")
    # ...

Configure slow mo

Run tests with slow mo with the --slowmo argument.

pytest --slowmo 100

Skip test by browser

# test_my_application.py
import pytest

@pytest.mark.skip_browser("firefox")
def test_visit_example(page):
    page.goto("https://example.com")
    # ...

Run on a specific browser

# conftest.py
import pytest

@pytest.mark.only_browser("chromium")
def test_visit_example(page):
    page.goto("https://example.com")
    # ...

Run with a custom browser channel like Google Chrome or Microsoft Edge

pytest --browser-channel chrome # or chrome-beta, chrome-dev, chrome-canary, msedge, msedge-beta, msedge-dev, msedge-canary
# test_my_application.py
def test_example(page):
    page.goto("https://example.com")

Configure base-url

Start Pytest with the base-url argument.

pytest --base-url http://localhost:8080
# test_my_application.py
def test_visit_example(page):
    page.goto("/admin")
    # -> Will result in http://localhost:8080/admin

Ignore HTTPS errors

# conftest.py
import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
    return {
        **browser_context_args,
        "ignore_https_errors": True
    }

Use custom viewport size

# conftest.py
import pytest

@pytest.fixture(scope="session")
def browser_context_args(browser_context_args):
    return {
        **browser_context_args,
        "viewport": {
            "width": 1920,
            "height": 1080,
        }
    }

Device emulation

# conftest.py
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,
    }

Persistent context

# conftest.py
import pytest
from playwright.sync_api import BrowserType
from typing import Dict

@pytest.fixture(scope="session")
def context(
    browser_type: BrowserType,
    browser_type_launch_args: Dict,
    browser_context_args: Dict
):
    context = browser_type.launch_persistent_context("./foobar", **{
        **browser_type_launch_args,
        **browser_context_args,
        "locale": "de-DE",
    })
    yield context
    context.close()

When using that all pages inside your test are created from the persistent context.

Debugging

Use with pdb

Use the breakpoint() statement in your test code to pause execution and get a pdb REPL.

def test_bing_is_working(page):
    page.goto("https://bing.com")
    breakpoint()
    # ...

Screenshot on test failure

You can capture screenshots for failed tests with a pytest runtest hook. Add this to your conftest.py file.

Note that this snippet uses slugify to convert test names to file paths, which can be installed with pip install python-slugify.

# conftest.py
from slugify import slugify
from pathlib import Path

def pytest_runtest_makereport(item, call) -> None:
    if call.when == "call":
        if call.excinfo is not None and "page" in item.funcargs:
            page = item.funcargs["page"]
            screenshot_dir = Path(".playwright-screenshots")
            screenshot_dir.mkdir(exist_ok=True)
            page.screenshot(path=str(screenshot_dir / f"{slugify(item.nodeid)}.png"))

Deploy to CI

Use the Playwright GitHub Action or guides for other CI providers to deploy your tests to CI/CD

Special thanks

Thanks to Max Schmitt for creating and maintaining this project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest-playwright-0.1.1.tar.gz (18.8 kB view details)

Uploaded Source

Built Distribution

pytest_playwright-0.1.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file pytest-playwright-0.1.1.tar.gz.

File metadata

  • Download URL: pytest-playwright-0.1.1.tar.gz
  • Upload date:
  • Size: 18.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.8.10

File hashes

Hashes for pytest-playwright-0.1.1.tar.gz
Algorithm Hash digest
SHA256 34c3d92bb9533c70f4393f2fda7097638732bf0d1627bfb3cd9d150c14581fda
MD5 b01387eed00f1400c7c9c703a4ad3824
BLAKE2b-256 af405aa6237b1ce376f4349d45197930d693e4c683dfa3d66dea0e96bcdf604a

See more details on using hashes here.

File details

Details for the file pytest_playwright-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: pytest_playwright-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.8.10

File hashes

Hashes for pytest_playwright-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cfc6ff2eb28419bd99626e46095c32ef9353515a0e888b2ed54d42930672c020
MD5 7888d6287a8a976b3309a44b261d8cd7
BLAKE2b-256 9050ded627a7c3586b707c88458bc45c0a4f513c30592541e6a264be8c1f090e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page