基础定位器方法
通过文本定位
page.get_by_text("点击我")
page.get_by_text("点击我", exact=False)
通过测试ID定位
page.get_by_test_id("submit-button")
通过占位符定位
page.get_by_placeholder("输入用户名")
通过标签定位
page.get_by_label("密码")
通过角色定位
page.get_by_role("button")
page.get_by_role("button", name="提交")
通过标准CSS选择器定位
page.locator("div.user-panel")
page.locator("#login-button")
page.locator("css=button")
通过 XPath 定位
page.locator("xpath=//button")
元素关系选择器
定位包含特定子元素的父元素
page.locator('div', has=page.locator('.child-class'))
page.locator('ul', has=page.locator('li.special'))
page.locator('section', has=page.get_by_text('特定文本'))
从父元素定位子元素
parent = page.locator('.parent-class')
child = parent.locator('.child-class')
page.locator('.grandparent').locator('.parent').locator('.child')
兄弟元素定位
page.locator('h2 + p')
page.locator('h2 ~ p')
复杂关系选择
page.locator('.parent', has=page.locator('span', has=page.locator('.icon')))
page.locator('div.card', has_not=page.locator('.disabled'))
模糊匹配
包含xxx
page.locator("[attr*='xxx']")
page.get_by_text(re.compile(r"xxx"))
以xxx开头
page.locator("[attr^='xxx']")
page.get_by_text(re.compile(r"^xxx"))
以xxx结尾
page.locator("[attr$='xxx']")
page.get_by_text(re.compile(r"xxx$"))
高级选择器
包含完整单词xxx
page.locator("[attr~='xxx']")
以完整单词xxx开头
page.locator("[attr|='xxx']")
iframe 操作
locator = page.frame_locator("my-frame").get_by_text("Submit")
locator.click()
frame = page.frame("frame-name")
frame.get_by_role("button").click()
链式组合
page.get_by_role("button").filter(has_text="登录")
page.locator("li").filter(has_text="项目").nth(2)
多元素选择和操作
获取多个元素
all_buttons = page.get_by_role("button").all()
count = await page.get_by_role("button").count()
for i in range(await page.locator("li").count()):
text = await page.locator("li").nth(i).text_content()
print(f"项目 {i}: {text}")
选择特定位置的元素
first = page.locator("li").first
last = page.locator("li").last
nth = page.locator("li").nth(2)
元素筛选
page.locator("div").filter(has_text="欢迎")
page.locator("section").filter(has=page.locator(".highlighted"))
buttons_without_icon = page.locator("button").filter(has_not=page.locator("i.icon"))
快速查找多个元素
rows = page.locator("table tr")
list_items = page.locator("ul.menu > li")
visible_links = page.locator("a:visible")
多元素断言
await expect(page.locator("li")).to_have_count(5)
await expect(page.locator(".item")).to_be_visible()
元素索引选择技巧
second_item = page.locator("div.item").nth(1)
first_item = page.locator("li").nth(0)
last_item = page.locator("li").nth(-1)
second_last = page.locator("tr").nth(-2)
多选择器组合
buttons = page.locator("button.primary, button.secondary")
menu_items = page.locator("nav li")
third_menu = menu_items.nth(2)
按顺序操作多个元素
elements = await page.locator("input[type='checkbox']").all()
for element in elements:
await element.check()
filtered = page.locator("option").filter(has_text=re.compile(r"产品"))
third_product = filtered.nth(2)
复杂场景示例
cell = page.locator("table tr").nth(2).locator("td").nth(1)
second_enabled = page.locator("button:not([disabled])").nth(1)
items_in_second_group = page.locator("div.group").nth(1).locator("li")
for i in range(5):
item = page.locator(".item").nth(i)
await item.click()