《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇
阅读原文时间:2023年08月17日阅读:1

1.简介

说到元素定位,小伙伴或者童鞋们肯定会首先想到 selenium 的八大元素定位大法。同理Playwright也有自己的元素定位的方法。今天就给小伙伴或者童鞋们讲解和分享一下Playwright的元素定位方法。

宏哥对UI自动化的理解:定位元素--->操作元素---->断言。

2.定位器

定位器(Locator)是 Playwright 的自动等待和重试能力的核心部分。定位器是一种随时在网页上查找元素的方法,用于在元素上执行诸如 .click、.fill 之类的操作。可以使用 page.locator(selector, **kwargs) 方法创建自定义定位器。

选择器(Selector)是用于创建定位器的字符串。Playwright 支持许多不同的选择器,比如 Text、CSS、XPath 等。阅读 in-depth guide 文档,了解更多关于可用的选择器以及如何进行选择的信息。

3.内置定位器

这些是 playwright 推荐的内置定位器。

  • page.get_by_role()通过显式和隐式可访问性属性进行定位。
  • page.get_by_text()通过文本内容定位。
  • page.get_by_label()通过关联标签的文本定位表单控件。
  • page.get_by_placeholder()按占位符定位输入。
  • page.get_by_alt_text()通过替代文本定位元素,通常是图像。
  • page.get_by_title()通过标题属性定位元素。
  • page.get_by_test_id()根据data-testid属性定位元素(可以配置其他属性)。

当然除了这些,还有其他定位方法,selenium的8种by元素定位,id、xpath、css等都可使用,还有W3C标准规定的webDriver协议为5种定位方式CSS、Link text、Partial link text、Tag name、XPath

playwright把这些定位归类成3种,分别是:css、xpath、text。

如:

page.locator("xpath=//h2")
page.locator("text=文本输入")
page.locator("#s-usersetting-top")
page.locator("input[name=\"wd\"]").click()
page.get_by_role("button", name="百度一下").click()
page2.get_by_placeholder("唱片名、表演者、条码、ISRC").click()
page2.get_by_text("或者,亲自来帮豆瓣添加:").click()

官方文档给出一个登录系统的使用示例如下:

page.get_by_label("User Name").fill("John")

page.get_by_label("Password").fill("secret-password")

page.get_by_role("button", name="Sign in").click()

expect(page.get_by_text("Welcome, John!")).to_be_visible()

3.1角色定位-page.get_by_role()

Playwright带有多个内置定位器。为了使测试具有弹性,我们建议优先考虑面向用户的属性和显式协定,例如page.get_by_role()。例如:以下 DOM 结构。

button通过名称为“登录”的角色定位元素。

page.get_by_role("button", name="Sign in").click()

每次将定位器用于操作时,都会在页面中找到一个最新的 DOM 元素。在下面的代码片段中,底层 DOM 元素将被定位两次,一次在每个动作之前。这意味着如果 DOM 由于重新渲染而在调用之间发生变化,则将使用与定位器对应的新元素。

locator = page.get_by_role("button", name="Sign in")

locator.hover()
locator.click()

请注意,所有创建定位器的方法(例如page.get_by_label() )也可用于Locator和FrameLocator类,因此您可以将它们链接起来并迭代地缩小定位器的范围。

locator = page.frame_locator("my-frame").get_by_role("button", name="Sign in")

locator.click()

page.get_by_role ()定位器反映了用户和辅助技术如何感知页面,例如某个元素是按钮还是复选框。按角色定位时,通常还应传递可访问的名称,以便定位器准确定位元素。

例如,考虑以下 DOM 结构。

您可以通过其隐式角色定位每个元素:

expect(page.get_by_role("heading", name="Sign up")).to_be_visible()

page.get_by_role("checkbox", name="Subscribe").check()

page.get_by_role("button", name=re.compile("submit", re.IGNORECASE)).click()

角色定位器包括按钮、复选框、标题、链接、列表、表格等,并遵循ARIA 角色、ARIA 属性和可访问名称的 W3C 规范。

请注意:许多html元素如:

6.HTML属性选择器定位

HTML 属性选择器, 根据html元素的id 定位

page.fill("id=kw", "北京-宏哥")

7.select选择器组合定位

定位目标元素,我们有时候可以使用>>(两个大于号)连接不同的selector可组合使用,例如:我们定位百度首页的登录

#id 属性+ css
page.fill('form >> [name="username"]', "北京-宏哥")
page.fill('form >> #TANGRAM__PSP_11__password', "aa123456")
page.click("text=登录")

form >> [name="username"] 定位方式等价于

#page.fill('form >> [name="username"]', "北京-宏哥")
page.locator("form").locator('[name="username"]').fill("北京-宏哥")

相当于是根据父元素找到子元素了

登录按钮的值是value="登录 > ",可以用text文本定位的方式,模糊匹配到,这种人性化的设计提高了定位的效率。

8.小结

今天这一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用,当然了这不是一成不变的,希望大家在使用中可以灵活的应用。

好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。