Playwright 的定位器(Locator)具备智能等待与自动重试机制,执行操作前自动检查元素可操作性(可见性、可点击性),大幅减少因网络延迟导致的脚本失败。其定位体系包含四大核心方法:
基础语法:
层级嵌套:选择子元素用 >,后代元素用空格
# 选择直接子元素
page.locator("div.container > button")
# 选择后代元素(跨层级)
page.locator("div.container span")
属性模糊匹配:
page.locator("[href*='miitbeian']") # 属性值包含字符串
page.locator("[href^='https']") # 属性值以指定字符串开头
伪类选择:定位指定次序的子元素
page.locator("button:nth-child(2)") # 第二个按钮
page.locator("tr:nth-of-type(odd)") # 奇数行表格
适用场景:静态页面、元素属性稳定的场景。
核心方法:
实战案例:点击动态生成的按钮
# 点击文本包含“提交”的按钮
page.locator("text=提交").click()
# 正则匹配“Log in”或“Login”
page.locator("text=/Log\s?in/i").click()
避坑指南: 1. 避免在长文本中使用精确匹配(如text="用户协议与隐私政策"),改用部分匹配text="用户协议" 2. 多语言网站优先用语义化定位替代
语法优势:支持函数计算和轴定位(如父节点、兄弟节点)
# 定位父元素为div的按钮
page.locator("//div/button")
# 定位同级的下一个兄弟元素
page.locator("//input[@name='email']/following-sibling::button")
函数应用:
# 文本包含"搜索"的按钮
page.locator("//button[contains(text(), '搜索')]")
# Class包含"btn-primary"的元素
page.locator("//*[contains(@class, 'btn-primary')]")
适用场景: 1. 元素无唯一属性,需通过组合属性(如//input[@type="text" and @placeholder="手机号"]) 2. 需跨层级定位(如表格中根据行文字定位操作按钮)
Playwright 提供专用 API,直接匹配 ARIA 角色:
# 按角色定位按钮
page.get_by_role("button", name="提交")
# 定位输入框的关联标签
page.get_by_label("用户名")
# 按占位文本定位
page.get_by_placeholder("请输入密码")
企业级实践:
开发阶段为关键元素添加 data-testid 属性:
<button data-testid="login-submit">登录</button>
测试脚本直接调用:
page.locator("[data-testid='login-submit']").click()
实现开发测试双赢(开发不干扰样式,测试定位稳定)
处理重复元素(如页眉/页脚的同名按钮):
# 先定位导航栏,再找其中的“关于”链接
page.get_by_role("navigation").get_by_role("link", name="关于")
从一组元素中筛选特定项:
# 选择包含“订单”文本的表格行
row = page.locator("tr").filter(has_text="订单")
# 点击该行的删除按钮
row.locator("button", has_text="删除").click()
page.wait_for_selector(".modal", state="visible") # 等待弹窗出现
page.locator("shadow=#host-element >> .inner-button").click()
frame = page.frame_locator("iframe.login")
frame.locator("input#username").fill("admin")
1. Playwright Inspector
命令行启动实时调试:
npx playwright test --ui
点击页面元素自动生成定位代码,支持复制为 Python/JS 语法。
2. VS Code 扩展
npx playwright codegen https://example.com
终极定位策略口诀:
🔸 语义第一:get_by_role() 兼顾可访问性与稳定性 🔸 CSS 为辅:ID/属性选择器优先,避免深层嵌套 🔸 文本/XPath 慎用:仅当无属性或复杂结构时启用 🔸 动态等待必加:wait_for_selector() 应对异步加载
掌握上述技巧,可解决 95% 的 Web 元素定位问题。实战代码示例参考 https://playwright.dev/python/docs/locators。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。