引言
自动化测试是软件开发中的重要环节,它确保了代码的稳定性和产品质量。Playwright,由微软开发,是一个针对现代Web应用的端到端测试工具,以其跨浏览器、跨平台和高效的特性而备受瞩目。本文将深入探讨Playwright的使用方法,最佳实践,以及如何将其与各种语言和测试框架集成。
1. 为什么选择Playwright
- 简洁的安装:Playwright的安装过程简单,无需安装各种Driver,且支持异步/同步编程。
- 跨平台支持:在Windows、Linux和macOS上本地或CI环境中运行,支持无头和有头测试。
- 多语言支持:包括TypeScript、JavaScript、Python、.NET和Java。
- 原生移动模拟:适用于Android的Google Chrome和Mobile Safari。
- 自动等待:元素可操作性检查,消除人为超时的需要。
- 网络优先断言:动态网络测试,自动重试直到满足条件。
- 强大的追踪功能:配置重试策略,捕获执行轨迹、视频和屏幕截图。
- 浏览器隔离:每个测试使用独立的浏览器上下文,提供零开销隔离。
2. Playwright使用
2.1 安装
- 使用Python的pip安装Playwright库:
pip install playwright
- 安装内置浏览器驱动:
python -m playwright install
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch() # 启动 Chromiumcontext = browser.new_context() # 新建一个上下文page = context.new_page() # 在上下文中新建一个页面page.goto('https://example.com') # 导航到指定的 URL
上面的例子使用了 sync_playwright()
来获取一个同步的可用的 Playwright 实例。在这个例子中,browser
、context
和 page
都是同步对象,这意味着代码会在这些对象准备就绪后再继续执行。
2.2 自动录制
- 查看命令行选项:
python-mplaywright codegen --help
- 从指定URL开始录制:
python-mplaywright codegen https://xingzheai.cn/
- 使用Chromium驱动,保存为Python脚本:
python-mplaywright codegen --target python -o 'my.py' -b chromium https://xingzheai.cn/
2.3 定制编写
- 使用选择器定位元素:
- CSS选择器:
querySelector(engine=body)
- XPath选择器:
querySelectorAll(engine=body)
- 等待元素:
waitForSelector(engine=body)
- CSS选择器:
- 事件交互:
- 下拉选择:
selectOption
,value
,label
,index
- 文件上传:
setInputFiles
, 单个或多个文件 - 鼠标操作:
click
,dbclick
,down
,up
,move
,tag
- 键盘操作:
press
- 屏幕截图和录屏:
screenshot
,recordVideo
Playwright 提供了多种方式来查找和操作页面上的元素:
- 下拉选择:
# 根据标签名查找第一个元素
elem = page.query_selector('div')# 根据 CSS 选择器查找所有的元素
elems = page.query_selector_all('li')# 等待元素的出现
await page.wait_for_selector('input')# 点击元素
await elem.click()# 填写表单元素
await elem.fill('some text')
2.4 网络拦截
- 使用
page.route
来拦截和处理网络请求。
2.5 同步与异步执行
- 使用
sync_playwright
或async_playwright
配合with
语句进行同步或异步测试。
Playwright 也支持异步编程风格,使用async with
关键字:
import asyncio
from playwright.async_api import async_playwrightasync def main():async with async_playwright() as p:browser = await p.chromium.launch()context = await browser.new_context()page = await context.new_page()await page.goto('https://example.com')asyncio.run(main())
在上面的例子中,browser
、context
和 page
都是异步对象,它们的操作需要通过 await
关键字来等待完成。
2.6 Pytest结合
- 安装pytest-playwright:
pip install pytest-playwright
- 编写测试用例:
import pytest from playwright import sync_playwrightdef test_playwright(page):page.goto("https://xingzheai.cn/")with page.expect_popup() as popup_info:page.click('text="智能内容审核"')assert "智能内容审核" == popup_info.value().textContent()
2.7 移动端操作
- 使用
playwright.devices
模拟移动设备。
3. 高级特性
1. 模拟用户行为
Playwright 可以模拟用户的鼠标、键盘和触控板操作:
# 鼠标点击
await elem.click()# 双击
await elem.double_click()# 右键点击
await elem.context_menu()# 按下键盘键
await page.keyboard.press('ArrowDown')# 输入文本
await elem.type('Hello World!')# 清空输入
await elem.clear()
2. 网络请求拦截
Playwright 允许你拦截和修改网络请求:
# 定义一个拦截器
def intercept(route):response = route.responseresponse.status = 200response.set_header('Content-Type', 'application/json')response.send({'msg': 'success'})# 应用拦截器
page.on('request', lambda route: intercept(route))
3. 跨域问题解决
Playwright 提供了一种简单的跨域解决方案:
# 在服务器端开启 CORS
Access-Control-Allow-Origin: *# 在客户端设置上下文参数
options = {'enableNetworkEmulation': True, 'networkConditions': {}}
context = browser.new_context(extra_args=['--disable-blink-features=OutOfBlanket'])
4. Playwright最佳实践
- 隔离测试:每个测试独立运行,避免依赖其他测试。
- 避免测试第三方依赖:只验证你控制的代码。
- 使用定位器:优先考虑用户可见的属性。
- 生成定位器:利用Playwright的codegen工具。
- 网络优先断言:使用
toBeVisible
等断言。 - 配置调试:使用Playwright的跟踪功能。
- 利用工具:使用Playwright的测试工具提升效率。
- 跨浏览器测试:确保在所有支持的浏览器上测试。
- 保持依赖最新:定期更新Playwright版本。