【playwright】 page.get_by_类型方法
在 Playwright 中,page.get_by_*
系列方法提供了一种更语义化、更直观的方式来定位页面上的元素。这些方法基于 HTML 的语义属性(如 placeholder
、role
、label
等)或特定的 DOM 属性,能够帮助你更轻松地编写可读性高的测试代码。
以下是 Playwright 提供的所有 get_by_*
方法及其详细说明:
1. page.get_by_placeholder()
功能:
通过 input
元素的 placeholder
属性定位元素。
示例:
# 定位 placeholder 为 "Search..." 的输入框
search_input = page.get_by_placeholder("Search...")
search_input.fill("Playwright")
适用场景:
- 页面中有多个输入框,但可以通过
placeholder
属性区分。
2. page.get_by_role()
功能:
根据 ARIA 角色(role
)定位元素。支持多种角色类型,如 button
、link
、textbox
等。
示例:
# 定位 role="button" 且名称为 "Submit" 的按钮
submit_button = page.get_by_role("button", name="Submit")
submit_button.click()# 定位 role="link" 且名称为 "Home" 的链接
home_link = page.get_by_role("link", name="Home")
home_link.click()
常用参数:
name
:匹配元素的可访问名称(通常是文本内容或aria-label
属性)。exact=True/False
:是否精确匹配名称(默认为模糊匹配)。
适用场景:
- 根据 ARIA 角色和名称定位交互元素(如按钮、链接、输入框等)。
3. page.get_by_label()
功能:
通过关联的 <label>
元素定位表单控件(如输入框、复选框等)。
示例:
# 定位 label 为 "Username" 的输入框
username_input = page.get_by_label("Username")
username_input.fill("JohnDoe")# 定位 label 为 "Remember me" 的复选框
remember_me_checkbox = page.get_by_label("Remember me")
remember_me_checkbox.check()
适用场景:
- 表单中有
<label>
标签与表单控件关联时使用。
4. page.get_by_text()
功能:
通过可见文本内容定位元素。
示例:
# 定位文本为 "Click here" 的元素
click_here_element = page.get_by_text("Click here")
click_here_element.click()
常用参数:
exact=True/False
:是否精确匹配文本内容(默认为模糊匹配)。
适用场景:
- 需要根据页面上的可见文本定位元素。
5. page.get_by_title()
功能:
通过 title
属性定位元素。
示例:
# 定位 title 属性为 "Close" 的按钮
close_button = page.get_by_title("Close")
close_button.click()
适用场景:
- 元素有
title
属性(通常用于工具提示)。
6. page.get_by_alt_text()
功能:
通过 alt
属性定位图像元素。
示例:
# 定位 alt 属性为 "Logo" 的图片
logo_image = page.get_by_alt_text("Logo")
logo_image.click()
适用场景:
- 需要定位具有
alt
属性的<img>
元素。
7. page.get_by_test_id()
功能:
通过自定义的 data-testid
属性定位元素。
示例:
# 定位 data-testid="submit-button" 的按钮
submit_button = page.get_by_test_id("submit-button")
submit_button.click()
适用场景:
- 在开发中为元素添加了
data-testid
属性以方便测试。
8. page.get_by_label()
和 page.get_by_role()
的组合使用
有时,标签和角色可以结合使用来更精确地定位元素。
示例:
# 定位 role="checkbox" 且 label 为 "Accept terms" 的复选框
accept_terms_checkbox = page.get_by_role("checkbox", name="Accept terms")
accept_terms_checkbox.check()
9. 常用方法的链式调用
所有 get_by_*
方法都返回一个 Locator
对象,因此可以与其他 Playwright 方法链式调用。
示例:
# 定位 placeholder 为 "Search..." 的输入框,并填充内容
page.get_by_placeholder("Search...").fill("Playwright")# 定位 role="button" 且名称为 "Submit" 的按钮,并点击
page.get_by_role("button", name="Submit").click()
10. 总结对比
方法 | 匹配依据 | 示例 | 适用场景 |
---|---|---|---|
get_by_placeholder() | input 元素的 placeholder 属性 | page.get_by_placeholder("Search...") | 输入框的占位符文本 |
get_by_role() | ARIA 角色和名称 | page.get_by_role("button", name="Submit") | 按钮、链接、输入框等交互元素 |
get_by_label() | <label> 标签的文本 | page.get_by_label("Username") | 表单控件(输入框、复选框等) |
get_by_text() | 可见文本内容 | page.get_by_text("Click here") | 页面上的可见文本 |
get_by_title() | title 属性 | page.get_by_title("Close") | 工具提示或标题属性 |
get_by_alt_text() | alt 属性 | page.get_by_alt_text("Logo") | 图片的替代文本 |
get_by_test_id() | 自定义的 data-testid 属性 | page.get_by_test_id("submit-button") | 开发者为测试提供的唯一标识 |
最佳实践
-
优先使用语义化方法:
- 使用
get_by_role()
和get_by_label()
等语义化方法,可以使测试代码更具可读性和可维护性。
- 使用
-
避免硬编码选择器:
- 尽量避免直接使用 CSS 或 XPath 选择器,而应优先使用
get_by_*
方法。
- 尽量避免直接使用 CSS 或 XPath 选择器,而应优先使用
-
结合开发者工具调试:
- 使用浏览器开发者工具查看元素的属性(如
placeholder
、aria-label
、role
等),以便更好地选择合适的定位方法。
- 使用浏览器开发者工具查看元素的属性(如
希望这些方法能帮助你更高效地编写 Playwright 测试脚本!