如何使用链式页面对象定位器?解决Locator属性报错问题
实现页面对象定位器的链式调用
你遇到的错误原因很明确:list_first_row是Playwright的Locator对象,而use_btn是TemplateListPage类的属性,两者不属于同一层级,自然无法通过链式调用访问。
要实现你想要的链式调用效果,有两种实用方案:
方案一:用自定义嵌套类封装行元素
创建一个专门的类来封装行元素及其子元素定位器,把行定位器包装成这个类的实例,就能通过链式调用访问子元素:
class TemplateRow: def __init__(self, row_locator): self.locator = row_locator # 基于父行定位器定义子元素定位器 self.use_btn = self.locator.locator(".useTemplate") class TemplateListPage: def __init__(self, page): self.page = page # 将第一行定位器包装为TemplateRow实例 self.list_first_row = TemplateRow(self.page.locator(".grid-row").first)
测试用例里就能直接链式调用:
# 断言第一行的按钮数量 expect(TemplateListPage(page).list_first_row.use_btn).to_have_count(0) # 点击第一行的按钮 TemplateListPage(page).list_first_row.use_btn.click()
这种方案适合行元素有多个子元素需要复用的场景,结构更清晰,扩展性更强。
方案二:直接定义组合定位器属性
如果只需要访问第一行的按钮,不需要复用行元素的其他子定位器,可以直接在页面对象里定义组合后的定位器:
class TemplateListPage: def __init__(self, page): self.page = page self.list_first_row = self.page.locator(".grid-row").first # 直接定义第一行内的按钮定位器 self.first_row_use_btn = self.list_first_row.locator(".useTemplate")
测试用例中调用方式:
expect(TemplateListPage(page).first_row_use_btn).to_have_count(0) TemplateListPage(page).first_row_use_btn.click()
这种写法更简洁,适合简单场景。
内容的提问来源于stack exchange,提问作者M András
相关产品推荐
相关产品推荐

