以下是 Playwright 的详细使用示例,涵盖基础操作、高级功能及实际应用场景,结合多个来源的实践指南和代码片段:
1. 基础浏览器操作
同步模式示例
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动浏览器(默认Chromium)
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 导航与操作
page.goto("https://www.baidu.com")
page.fill("#kw", "Playwright自动化测试")
page.click("#su")
# 等待元素并截图
page.wait_for_selector("text=百度百科")
page.screenshot(path="search_result.png")
browser.close()
关键点:
launch(headless=False)
可可视化调试。wait_for_selector
自动等待元素加载,避免硬编码等待时间。
异步模式示例
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()
await page.goto("https://example.com")
print(await page.title())
await browser.close()
asyncio.run(main())
适用场景:高并发或需要非阻塞操作的场景。
2. 高级功能示例
多浏览器支持
with sync_playwright() as p:
# 同时控制Chromium、Firefox、WebKit
browsers = [p.chromium.launch(), p.firefox.launch(), p.webkit.launch()]
for browser in browsers:
page = browser.new_page()
page.goto("https://example.com")
assert "Example" in page.title()
browser.close()
优势:跨浏览器兼容性测试。
文件上传与下载
# 文件上传
page.set_input_files("#file_input", "path/to/file.txt")
# 文件下载
with page.expect_download() as download_info:
page.click("#download_btn")
download = download_info.value
download.save_as("downloaded_file.zip")
注意:需监听下载事件并处理路径。
移动端模拟
iphone_12 = p.devices["iPhone 12 Pro"]
browser = p.chromium.launch()
context = browser.new_context(**iphone_12)
page = context.new_page()
page.goto("https://m.example.com")
page.screenshot(path="mobile_view.png")
特点:模拟设备分辨率、User-Agent等。
3. 实际应用场景
登录流程测试
def test_login():
page.goto("https://example.com/login")
page.fill("#username", "testuser")
page.fill("#password", "password123")
page.click("#login_button")
assert page.url == "https://example.com/dashboard"
最佳实践:结合 pytest
框架和断言验证。
动态选择框处理
# 等待选项加载后选择
page.wait_for_selector("#fruit option[value='banana']")
page.select_option("#fruit", "banana")
# 多选框操作
page.select_option("#fruits", ["apple", "cherry"])
适用场景:依赖动态数据的表单。
4. 测试框架集成
Pytest + Playwright
import pytest
from playwright.sync_api import Page
@pytest.fixture(scope="module")
def browser():
with sync_playwright() as p:
browser = p.chromium.launch()
yield browser
browser.close()
def test_search(browser):
page = browser.new_page()
page.goto("https://google.com")
page.fill('input[name="q"]', "Playwright")
page.press('input[name="q"]', "Enter")
assert "Playwright" in page.title()
优势:模块化测试用例和资源管理。
录制生成测试脚本
# 通过录制生成代码
playwright codegen https://example.com
功能:自动生成操作代码,适合快速原型设计。
5. 调试与优化
追踪与截图
# 启用追踪
context.tracing.start(screenshots=True, snapshots=True)
context.tracing.stop(path="trace.zip")
# 元素截图
page.locator(".header").screenshot(path="header.png")
用途:调试失败用例时分析操作步骤。
并行测试
# 使用pytest-xdist并行执行
pytest --numprocesses auto
性能优化:减少测试总时长。
总结
Playwright的核心优势包括:
- 跨浏览器支持:Chromium、Firefox、WebKit。
- 自动等待机制:减少因元素未加载导致的失败。
- 多语言兼容:Python、JavaScript、Java等。