A high-level API to automate web browsers
Project description
🎭 Playwright for Python
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 90.0.4421.0 | ✅ | ✅ | ✅ |
WebKit 14.1 | ✅ | ✅ | ✅ |
Firefox 86.0b10 | ✅ | ✅ | ✅ |
Headless execution is supported for all browsers on all platforms.
Usage
pip install playwright==1.8.0a1
playwright install
This installs Playwright and browser binaries for Chromium, Firefox and WebKit. Playwright requires 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 you app is based on the modern asyncio loop and you are used to async/await constructs, Playwright exposes Async API for you. You should also use this API inside the Jupyter Notebook and other REPL frameworks that are already based on 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 Jupyter Notebook:
>>> 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!
Is Playwright ready?
Yes, Playwright for Python is ready! The latest version of Playwright for Python is 1.8.0a. We are ready to drop the Alpha bit once we hear from you. Once it is gone, we will become semver compatible and the API will be frozen in its present form for years. We will still be adding features with every release, but we promise to not break it anymore!
Migration from the pre-release versions
The API has changed since the last 0.170.0 version:
-
Snake case notation for methods and arguments:
# old browser.newPage()
# new browser.new_page()
-
Import has changed to include sync vs async mode explicitly:
# old from playwright import sync_playwright
# new from playwright.sync_api import sync_playwright
That's about it! Our new doc site uses proper notation and examples for the new API.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
File details
Details for the file playwright-1.9.2-py3-none-win_amd64.whl
.
File metadata
- Download URL: playwright-1.9.2-py3-none-win_amd64.whl
- Upload date:
- Size: 40.4 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.7.0 requests/2.25.1 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 56fa74752a9f68b8f9c56373e2f3f9e11b5d8aa4395550bfb4aeb1740ab63dba |
|
MD5 | 790693cce6a3b890e9cb0adf5d2dbcb7 |
|
BLAKE2b-256 | 7147fe3010164f3d67c9270c4493e507b8078680fd63c6028407977b89efa3c8 |
File details
Details for the file playwright-1.9.2-py3-none-win32.whl
.
File metadata
- Download URL: playwright-1.9.2-py3-none-win32.whl
- Upload date:
- Size: 35.4 MB
- Tags: Python 3, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.7.0 requests/2.25.1 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0e358da92719d0049d4f3ff112bd86facafd2c2ecef6d21bc85dd33c4f288f2b |
|
MD5 | 7a303e14180dc0e141a9a5ddcfe4ebe1 |
|
BLAKE2b-256 | ed6f455afea4851dc2578313c24bef8b050187868880e03fca8b796b95929544 |
File details
Details for the file playwright-1.9.2-py3-none-manylinux1_x86_64.whl
.
File metadata
- Download URL: playwright-1.9.2-py3-none-manylinux1_x86_64.whl
- Upload date:
- Size: 59.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.7.0 requests/2.25.1 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 33d8af981da772f5ff51948a7c81144c394fbcb9177aced3e1b8314baf46bcdb |
|
MD5 | 79871fc09dc2f9e96dbf8fe0af15a8e1 |
|
BLAKE2b-256 | b7fda755971645836850765149e212ccc6a9756494ea438ac0a9efec4f5f9002 |
File details
Details for the file playwright-1.9.2-py3-none-macosx_11_0_universal2.whl
.
File metadata
- Download URL: playwright-1.9.2-py3-none-macosx_11_0_universal2.whl
- Upload date:
- Size: 57.6 MB
- Tags: Python 3, macOS 11.0+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.7.0 requests/2.25.1 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 004da16951eee53fd6a1878f2d58a6697f69ced2e18cda0e33dc5dcaaa50c65c |
|
MD5 | 10d4679a949e93889c3e1c3b8bd81322 |
|
BLAKE2b-256 | f0297daaef427f5f01fa73cd0cb5d0bf19e56c5ec7483d45dd369eacbfafbb7e |
File details
Details for the file playwright-1.9.2-py3-none-macosx_10_13_x86_64.whl
.
File metadata
- Download URL: playwright-1.9.2-py3-none-macosx_10_13_x86_64.whl
- Upload date:
- Size: 57.6 MB
- Tags: Python 3, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.7.0 requests/2.25.1 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6c81ecd05f4067fd92f82d2ea37b60ed57e6859e52eabdb4704ce158a965d7e5 |
|
MD5 | c1b7432c66ff3823d8975833fbea42f2 |
|
BLAKE2b-256 | b839b1d7cbf2f4d2a0bda3f96ea3fc0bc42b24573037dbc984c90f2c2264e76f |