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.4412.0 | ✅ | ✅ | ✅ |
WebKit 14.1 | ✅ | ✅ | ✅ |
Firefox 86.0b9 | ✅ | ✅ | ✅ |
Headless execution is supported for all browsers on all platforms.
pip install playwright==1.8.0a1
playwright install
This installs Playwright and browser binaries for Chromium, Firefox and WebKit. Playwright requires Python 3.7+.
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.
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()
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())
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")
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()
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()
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())
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()
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())
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()
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())
Check out our new documentation site!
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!
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.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。