Playwright:现代Web自动化测试的强大工具
1. Playwright简介与意义
Playwright是由Microsoft开发的一个开源自动化测试库,它支持跨浏览器(Chromium、WebKit和Firefox)的Web自动化测试。与Selenium等传统工具相比,Playwright提供了更现代化的API、更快的执行速度以及更可靠的测试能力。
Playwright的核心优势:
- 支持所有现代浏览器
- 自动等待元素出现,减少测试中的"flakiness"
- 可以模拟移动设备、地理位置和权限
- 支持无头模式和有头模式
- 提供网络拦截和模拟能力
- 内置截图和视频录制功能
Playwright不仅适用于测试,还可用于网页截图、PDF生成、网页爬虫等各种Web自动化任务。
2. Playwright核心功能与Python示例
2.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://example.com")
# 获取页面标题
print(page.title())
# 关闭浏览器
browser.close()
代码解释:
- 使用
sync_playwright上下文管理器管理Playwright资源 launch()方法启动浏览器实例,headless=False表示以可视化模式运行new_page()创建一个新标签页goto()导航到指定URLtitle()获取当前页面标题- 最后关闭浏览器释放资源
2.2 元素定位与交互
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://demoqa.com/text-box")
# 通过CSS选择器定位元素并输入文本
page.fill("#userName", "John Doe")
# 通过placeholder属性定位
page.fill("input[placeholder='name@example.com']", "john@example.com")
# 通过XPath定位
page.fill("//textarea[@id='currentAddress']", "123 Main St")
# 点击按钮
page.click("#submit")
# 验证输出
output = page.query_selector("#output")
print(output.inner_text())
browser.close()
代码解释:
fill()方法用于在输入框中输入文本- 支持CSS选择器、XPath等多种定位方式
click()模拟鼠标点击操作query_selector()查找元素,inner_text()获取元素文本内容
2.3 处理弹窗和对话框
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 监听对话框事件
page.on("dialog", lambda dialog: dialog.accept("Hello from Playwright!"))
page.goto("https://demoqa.com/alerts")
# 触发alert
page.click("#alertButton")
# 触发confirm对话框
page.click("#confirmButton")
# 触发prompt对话框
page.click("#promtButton")
browser.close()
代码解释:
page.on("dialog", ...)设置对话框处理函数- 可以处理alert、confirm和prompt三种类型的对话框
dialog.accept()接受对话框并可选择输入文本
2.4 处理iframe
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://demoqa.com/frames")
# 通过name属性定位iframe
frame = page.frame(name="frame1")
# 在iframe中操作元素
heading = frame.query_selector("#sampleHeading")
print(heading.inner_text())
browser.close()
代码解释:
page.frame()获取iframe的引用- 在iframe对象上可以执行与page相同的操作
- 需要先切换到iframe才能操作其中的元素
2.5 网络请求拦截与模拟
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 拦截请求
def handle_request(route, request):
if "api.example.com" in request.url:
# 模拟API响应
route.fulfill(
status=200,
content_type="application/json",
body='{"success": true, "data": "mocked"}'
)
else:
route.continue_()
page.route("**/*", handle_request)
page.goto("https://example.com")
browser.close()
代码解释:
page.route()设置请求拦截器- 可以检查每个请求并决定是继续(
continue_)还是模拟响应(fulfill) - 非常适合测试前端在不同API响应下的行为
2.6 截图与PDF生成
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# 截取整个页面
page.screenshot(path="fullpage.png", full_page=True)
# 截取特定元素
element = page.query_selector("h1")
element.screenshot(path="heading.png")
# 生成PDF
page.pdf(path="page.pdf")
browser.close()
代码解释:
screenshot()可以截取整个页面或特定元素full_page=True参数可以截取完整的长页面pdf()方法将页面转换为PDF文件
2.7 模拟移动设备和地理位置
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 模拟iPhone 11
iphone_11 = p.devices["iPhone 11"]
browser = p.chromium.launch(headless=False)
context = browser.new_context(
**iphone_11,
locale="en-US",
geolocation={"longitude": -122.08, "latitude": 37.42},
permissions=["geolocation"]
)
page = context.new_page()
page.goto("https://maps.google.com")
# 点击"我的位置"按钮
page.click("text='Your location'")
browser.close()
代码解释:
- 使用预定义的设备配置模拟移动设备
- 可以设置语言、地理位置和权限
new_context()创建带有特定配置的浏览器上下文
3. 总结
Playwright作为现代Web自动化工具,具有以下显著优势:
- 跨浏览器支持:单一API支持Chromium、WebKit和Firefox
- 自动等待:减少测试中的时序问题,提高稳定性
- 丰富的功能:从基本操作到高级网络拦截、设备模拟一应俱全
- 多语言支持:除了Python,还支持JavaScript、TypeScript、Java和.NET
- 出色的文档和社区支持:学习曲线平缓,问题容易解决
对于Web自动化测试、爬虫开发或任何需要与浏览器交互的任务,Playwright都是一个强大而可靠的选择。它的现代化设计和对复杂Web应用的良好支持,使其成为Selenium的有力替代品。
通过本文介绍的各种功能和示例代码,读者可以快速上手Playwright并开始构建自己的Web自动化解决方案。
















