Skip to main content

🎭 Playwright for Python PyPI version Anaconda version Join Slack

Docs | API

Playwright is a Python library to automate Chromium, Firefox and WebKit browsers with a single API. Playwright delivers automation that is ever-green, capable, reliable and fast. See how Playwright is better.

Linux macOS Windows
Chromium 92.0.4498.0 ✅ ✅ ✅
WebKit 14.2 ✅ ✅ ✅
Firefox 89.0b6 ✅ ✅ ✅

Headless execution is supported for all browsers on all platforms.

Usage - pip

PyPI version

pip install playwright
playwright install

This installs Playwright and browser binaries for Chromium, Firefox and WebKit. Playwright requires Python 3.7+.

Usage - conda

Anaconda version

conda config --add channels conda-forge
conda config --add channels microsoft
conda install playwright
playwright install

This installs Playwright and browser binaries for Chromium, Firefox and WebKit with the conda package manager. Playwright requires a conda environment with Python 3.7+.

Record and generate code

Playwright can record user interactions in a browser and generate code. See demo.

# Pass --help to see all options
playwright codegen

Playwright offers both sync (blocking) API and async API. They are identical in terms of capabilities and only differ in how one consumes the API.

Sync API

This is our default API for short snippets and tests. If you are not using asyncio in your application, it is the easiest to use Sync API notation.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch()
        page = browser.new_page()
        page.goto('http://whatsmyuseragent.org/')
        page.screenshot(path=f'example-{browser_type.name}.png')
        browser.close()

Async API

If your app is based on the modern asyncio loop and you are used to async/await constructs, Playwright exposes Async API for you. You should use this API inside a Python REPL supporting asyncio like with python -m asyncio

$ python -m asyncio
import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        for browser_type in [p.chromium, p.firefox, p.webkit]:
            browser = await browser_type.launch()
            page = await browser.new_page()
            await page.goto('http://whatsmyuseragent.org/')
            await page.screenshot(path=f'example-{browser_type.name}.png')
            await browser.close()

asyncio.run(main())

With pytest

Use our pytest plugin for Playwright.

def test_playwright_is_visible_on_google(page):
    page.goto("https://www.google.com")
    page.type("input[name=q]", "Playwright GitHub")
    page.click("input[type=submit]")
    page.wait_for_selector("text=microsoft/Playwright")

Interactive mode (REPL)

Blocking REPL, as in CLI:

>>> from playwright.sync_api import sync_playwright
>>> playwright = sync_playwright().start()

# Use playwright.chromium, playwright.firefox or playwright.webkit
# Pass headless=False to see the browser UI
>>> browser = playwright.chromium.launch()
>>> page = browser.new_page()
>>> page.goto("http://whatsmyuseragent.org/")
>>> page.screenshot(path="example.png")
>>> browser.close()
>>> playwright.stop()

Async REPL such as asyncio REPL:

$ python -m asyncio
>>> from playwright.async_api import async_playwright
>>> playwright = await async_playwright().start()
>>> browser = await playwright.chromium.launch()
>>> page = await browser.new_page()
>>> await page.goto("http://whatsmyuseragent.org/")
>>> await page.screenshot(path="example.png")
>>> await browser.close()
>>> await playwright.stop()

Examples

Mobile and geolocation

This snippet emulates Mobile Safari on a device at a given geolocation, navigates to maps.google.com, performs action and takes a screenshot.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    iphone_11 = p.devices["iPhone 11 Pro"]
    browser = p.webkit.launch(headless=False)
    context = browser.new_context(
        **iphone_11,
        locale="en-US",
        geolocation={"longitude": 12.492507, "latitude": 41.889938 },
        permissions=["geolocation"]
    )
    page = context.new_page()
    page.goto("https://maps.google.com")
    page.click("text=Your location")
    page.screenshot(path="colosseum-iphone.png")
    browser.close()
Async variant
import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        iphone_11 = p.devices["iPhone 11 Pro"]
        browser = await p.webkit.launch(headless=False)
        context = await browser.new_context(
            **iphone_11,
            locale="en-US",
            geolocation={"longitude": 12.492507, "latitude": 41.889938},
            permissions=["geolocation"]
        )
        page = await context.newPage()
        await page.goto("https://maps.google.com")
        await page.click("text="Your location"")
        await page.screenshot(path="colosseum-iphone.png")
        await browser.close()

asyncio.run(main())

Evaluate JS in browser

This code snippet navigates to example.com in Firefox, and executes a script in the page context.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.firefox.launch()
    page = browser.new_page()
    page.goto("https://www.example.com/")
    dimensions = page.evaluate("""() => {
      return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight,
        deviceScaleFactor: window.devicePixelRatio
      }
    }""")
    print(dimensions)
    browser.close()
Async variant
import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.firefox.launch()
        page = await browser.new_page()
        await page.goto("https://www.example.com/")
        dimensions = await page.evaluate("""() => {
          return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio
          }
        }""")
        print(dimensions)
        await browser.close()

asyncio.run(main())

Intercept network requests

This code snippet sets up request routing for a Chromium page to log all network requests.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()

    def log_and_continue_request(route, request):
        print(request.url)
        route.continue_()

    # Log and continue all network requests
    page.route("**/*", log_and_continue_request)

    page.goto("http://todomvc.com")
    browser.close()
Async variant
import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()

        async def log_and_continue_request(route, request):
            print(request.url)
            await route.continue_()

        # Log and continue all network requests
        await page.route("**/*", log_and_continue_request)
        await page.goto("http://todomvc.com")
        await browser.close()

asyncio.run(main())

Documentation

Check out our new documentation site!

Metadata

Release files for playwright 1.11.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for playwright 1.11.2
File
playwright-1.11.2-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
playwright-1.11.2-py3-none-win32.whl Python 3 none Windows x86-32 Details
playwright-1.11.2-py3-none-manylinux1_x86_64.whl Python 3 none Linux glibc 2.5+ x86-64 Details
playwright-1.11.2-py3-none-macosx_11_0_universal2.whl Python 3 none macOS 11.0+ universal2 (ARM64, x86-64) Details
playwright-1.11.2-py3-none-macosx_10_13_x86_64.whl Python 3 none macOS 10.13+ x86-64 Details

Total release size: 84.0 MB

Release files / playwright-1.11.2-py3-none-win_amd64.whl

Download URL playwright-1.11.2-py3-none-win_amd64.whl
Size 14.8 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
1f6d4ae12b9f3bc05b0b03421fe502978c13413167a15cc91ff029d7ba74b7b7
BLAKE2b-256 checksum
How to use checksums
3a8f6a0dd05146440f6688929f14bcdaed9d41e33e2fd0c5d4082949fb90ca6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/56.1.0 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release files / playwright-1.11.2-py3-none-win32.whl

Download URL playwright-1.11.2-py3-none-win32.whl
Size 13.2 MB
Tags Python 3 Windows x86-32
SHA-256 checksum
How to use checksums
6fb472570a746c5478736d60a973b87e54a4f9333b639c6065d297c9028e9187
BLAKE2b-256 checksum
How to use checksums
3b15be71ac8ade85f397b6c5859e406c7be9bfffe1c91908efb0b22deb95056d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/56.1.0 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release files / playwright-1.11.2-py3-none-manylinux1_x86_64.whl

Download URL playwright-1.11.2-py3-none-manylinux1_x86_64.whl
Size 20.1 MB
Tags Linux glibc 2.5+ x86-64 Python 3
SHA-256 checksum
How to use checksums
bb34780cfce8aa1a52be867e4b099735bf0cd7fbb35df879ddd64678374913fa
BLAKE2b-256 checksum
How to use checksums
042f873e3e1afec5e251fa8faa0a9cac8d85180fe4a7e329ea716dff6170592b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/56.1.0 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release files / playwright-1.11.2-py3-none-macosx_11_0_universal2.whl

Download URL playwright-1.11.2-py3-none-macosx_11_0_universal2.whl
Size 17.9 MB
Tags Python 3 macOS 11.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
04068e6bbba4979acef6f760f89cb81bff755dbdebcda1701a6d1ae0d9a0b269
BLAKE2b-256 checksum
How to use checksums
72183ef51fa974bb52d0ad17724ba754a3c40b8787d3ad0e907c94d277d3deb5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/56.1.0 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release files / playwright-1.11.2-py3-none-macosx_10_13_x86_64.whl

Download URL playwright-1.11.2-py3-none-macosx_10_13_x86_64.whl
Size 17.9 MB
Tags Python 3 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
5243fa5c7418aa16d678c65001e46404f0ffc06441b97ab3dc33a6e03ec478ad
BLAKE2b-256 checksum
How to use checksums
4ae75d26c7b3082ba5e5d8f51cca6db13a96adac29d486b82ce63340a44c42f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/56.1.0 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5

Release history Release notifications | RSS feed

1.63.0

8 release files

1.62.0

8 release files

1.61.0

8 release files

1.60.0

8 release files

1.59.0

8 release files

1.58.0

8 release files

1.56.0

8 release files

1.55.0

8 release files

1.54.0

8 release files

1.53.0

8 release files

1.52.0

8 release files

1.51.0

7 release files

1.49.1

7 release files

1.49.0

7 release files

1.48.0

7 release files

1.47.0

7 release files

1.46.0

7 release files

1.45.1

7 release files

1.44.0

7 release files

1.41.1

7 release files

1.41.0

7 release files

1.40.0

7 release files

1.39.0

7 release files

1.38.0

7 release files

1.37.0

7 release files

1.36.0

7 release files

1.35.0

7 release files

1.34.0

7 release files

1.32.1

7 release files

1.32.0

7 release files

1.31.1

7 release files

1.31.0

7 release files

1.30.0

7 release files

1.29.0

7 release files

1.28.0

7 release files

1.27.1

7 release files

1.26.1

7 release files

1.26.0

7 release files

1.25.2

7 release files

1.25.1

7 release files

1.25.0

7 release files

1.24.0

7 release files

1.23.1

7 release files

1.23.0

7 release files

1.22.0

7 release files

1.21.0

7 release files

1.20.1

7 release files

1.20.0

7 release files

1.19.1

7 release files

1.19.0

7 release files

1.18.1

7 release files

1.18.0

7 release files

1.17.1

7 release files

1.17.0

7 release files

1.16.1

5 release files

1.16.0

5 release files

1.15.1

5 release files

1.15.0

5 release files

1.14.1

5 release files

1.14.0

5 release files

1.13.1

5 release files

1.13.0

5 release files

1.12.1

5 release files

This release

1.11.2 This release

5 release files

1.11.1

5 release files

1.11.0

5 release files

1.10.0

5 release files

1.9.2

5 release files

1.9.1

5 release files

1.9.0

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page