Playwright定位元素与操作
Playwright 提供了多种灵活的元素定位和交互方式。下面这个表格汇总了其主要的元素定位方法、常见操作函数和一些进阶技巧:
| 类别 | 方法/函数 | 说明 |
|---|---|---|
| 元素定位方法 | page.get_by_role() |
通过角色(如button、link)定位 |
page.get_by_label() |
通过关联标签文本定位表单控件 | |
page.get_by_placeholder() |
按占位符定位输入框 | |
page.get_by_text() |
通过文本内容定位 | |
page.get_by_alt_text() |
通过替代文本定位元素(如图像) | |
page.get_by_title() |
通过标题属性定位元素 | |
page.get_by_test_id() |
根据 data-testid 或其他测试ID属性定位元素 |
|
page.locator() (配合 CSS 或 XPath) |
使用 CSS 选择器 或 XPath 定位元素 | |
| 常见操作函数 | locator.fill() / page.fill() |
快速填充表单字段 |
locator.click() / page.click() |
点击元素 | |
locator.type() |
模拟键盘逐个字符输入 | |
locator.select_option() |
选择下拉框选项 | |
locator.set_checked() / locator.check() / locator.uncheck() |
操作复选框和单选按钮 | |
locator.set_input_files() |
文件上传 | |
locator.hover() |
鼠标悬停 | |
locator.drag_to() |
拖拽元素 | |
| 进阶定位与断言 | locator.and_() / locator.or_() |
组合定位器 |
expect(locator).toBeVisible() 等 |
异步断言,会自动重试直到条件满足或超时 |
🎯 元素定位方法详解
在 Playwright 中,locator 是用于定位并操作页面元素的核心工具。
- 内置定位器:Playwright 推荐使用这些方法,因为它们具有良好的可读性且能适应 DOM 的变化。
- 按角色定位:
get_by_role()允许你根据元素的可访问性角色(如button、link、heading)来定位,通常还可以配合name选项进一步筛选。例如:page.get_by_role('button', name='Sign in')。 - 按标签文本定位:
get_by_label()非常适合定位与表单控件关联的label元素。例如:page.get_by_label('User Name')。 - 按文本定位:
get_by_text()可以直接定位包含特定文本的元素。例如:page.get_by_text('Submit')。 - 其他内置定位器:还包括通过占位符
get_by_placeholder()、图片替代文本get_by_alt_text()、标题属性get_by_title()以及专为测试设计的get_by_test_id()(默认查找data-testid属性)。
- 按角色定位:
- CSS 和 XPath 选择器:你也可以使用
page.locator()并传入 CSS 选择器 或 XPath 表达式。例如:- CSS 选择器:
page.locator('h1') - XPath 表达式:
page.locator('//h1')
- CSS 选择器:
- 文本精确与模糊匹配:使用文本定位时,
text='新闻'(带引号)进行精确匹配(对大小写敏感),而text=新闻(不带引号)则进行模糊匹配(对大小写不敏感)。
🛠️ 常见操作函数
定位到元素后,你可以使用多种方法与之交互:
- 填充表单:
locator.fill()是填充文本字段最简单的方式,它会先聚焦元素,然后触发input事件,适用于<input>,<textarea>,[contenteditable]等元素。例如:page.get_by_label('User Name').fill('muller')。 - 点击元素:
locator.click()模拟鼠标点击。它还支持多种选项,如button="right"表示右键点击,modifiers=["Shift"]表示按住 Shift 键点击,以及position: {x: 0, y: 0}指定点击位置。 - 模拟键入:与
fill()直接填充不同,locator.type()会模拟键盘逐个字符输入,并触发所有相应的keydown,keyup,keypress事件。你还可以设置delay来模拟真实用户的输入速度。除非页面有特殊的键盘事件处理,否则多数情况下fill()更高效。 - 处理下拉框:使用
locator.select_option()可以选择<select>元素中的选项。你可以通过选项的value或显示的label来选择,也支持多选。 - 操作复选框和单选按钮:
locator.set_checked()或locator.check()/locator.uncheck()是操作复选框和单选按钮最简单的方式。 - 文件上传:使用
locator.set_input_files()方法可以选择要上传的文件,它需要一个类型为file的输入元素。如果需要处理动态生成的文件选择对话框,可以结合page.expect_file_chooser()使用。 - 鼠标悬停:
locator.hover()模拟鼠标悬停在元素上的动作。 - 元素拖拽:
locator.drag_to()方法可以将一个元素拖拽到另一个目标元素。
🧩 进阶定位与断言
- 组合定位器:当简单定位器无法满足需求时,可以使用
locator.and_()(逻辑与)和locator.or_()(逻辑或)来组合多个定位器,实现更复杂的定位条件。and_()用于等待多个元素同时出现。or_()用于等待多个元素中任意一个出现。
- 智能断言:Playwright Test 中的
expect函数提供了许多异步的、会自动重试的匹配器,直到条件满足或超时。这在等待动态内容时非常有用。例如:await expect(page.getByTestId('status')).toHaveText('Submitted');- 其他常用断言包括
toBeVisible(),toBeEnabled(),toHaveAttribute(),toHaveClass()等。
💎 最佳实践与技巧
- 优先使用内置定位器:相较于 CSS 和 XPath,内置定位器(如
get_by_role,get_by_text等)更能适应页面结构的变化,通常能写出更健壮的代码。 - 善用智能等待:Playwright 的许多操作(如点击、填充)和断言内置了自动等待机制,无需手动添加固定等待(如
page.waitForTimeout),这有助于提高测试的稳定性和执行速度。 - 组合定位应对复杂场景:对于动态加载的复杂组件或需要处理多种可能结果的场景,利用
and_()和or_()组合定位器可以更高效地表达等待条件。 - 使用软断言:通过
expect.soft()执行软断言,即使某个断言失败,测试也会继续执行,这在需要收集多个验证点结果时非常有用。
墨者看遍天下皆是丹青,测试看尽万物皆是bug

浙公网安备 33010602011771号