UI自动化神器:Playwright元素定位方法!

发布于:2025-07-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

你是否曾在 UI 自动化中被“元素定位失败”困扰?或是因为页面结构频繁变动,测试脚本不断崩掉?在 Selenium 和 Cypress 的时代,这确实令人头疼。但 Playwright 却以其“智能等待”和“Locator API”带来颠覆性体验:自动等待、动态重试、更语义化——让定位在准确与稳定间找到平衡。

Web 应用的复杂性和用户期望不断攀升,单页应用(SPA)和跨浏览器兼容性让 UI 自动化测试变得至关重要。想象一下,您的电商平台上线后,用户因登录失败或搜索功能异常而流失,业务损失可能高达数千元!Playwright 作为一款强大的 UI 自动化测试工具,以其跨浏览器支持、自动等待机制和灵活的元素定位方法,成为开发者的“神器”。今天,我们为您献上一份 Playwright 元素定位方法与实战案例全面指南,从基础定位到复杂场景,带您从入门到精通!

Playwright 的定位方法为何备受推崇?通过本文,我们将深入解答这些问题,带您从理论到实践,全面掌握 Playwright 元素定位的精髓!

Playwright 是微软开发的 Web应用 的 自动化测试框架 ,它可以弥补传统UI自动化框架selenium很多的不足,在目前众多的UI自动化测试工具中脱颖而出。所以,本文章给大家介绍这个UI自动化神器的安装使用和元素定位方法,如果还没有用过的同学可以赶紧get起来哦~!

playwright介绍

Playwright 是由微软 2020年开发发布的一款新型自动化测试框架, 可以 UI自动化测试 和接口自动化测试 移动端的web仿真应用。Playwright 是基于 Node.js 语言开发的,而且不需要再重新下载一个浏览器驱动,相当于已经写好了,仅仅需要安装这个库即可。

官方中文文档:https://playwright.net.cn/python/docs/intro

相比于selenium的优势:

  • 不用自己安装浏览器,也不用安装驱动,不用考虑驱动和浏览器的兼容性,更稳定且兼容性更好

  • 内部自带等待机制  不用自己写太多的等待

  • 自带很丰富的断言的方法

  • Playwright 通过使用浏览器的底层调试协议来进行操作,相比于 Selenium 和 pyppeteer,它具有更快的执行速度和更低的资源消耗

  • 支持异步请求操作, 可以跨多个窗口操作 不相互影响 能实现相互隔离, 快速执行

  • 支持屏幕录制功能:根据屏幕录制指定生成相关操作代码。

  • 自带定位检测器:帮助我们做元素定位 ,也可以像selenium F12自己写元素定位,支持丰富的元素定位的方法

playwright的特色:

1)跨浏览器支持:包括 Chrome、Firefox 和 WebKit内核的浏览器。

2)跨平台:在 Windows、Linux 和 macOS 上进行本地或 CI 测试,无头或有头模式。

3)跨语言: 在 TypeScript、JavaScript、Python、.NET、Java 中使用 Playwright API

4)测试移动端:适用于 Android 的 Google Chrome 和 Mobile Safari 的原生移动模拟。

安装环境:

  • 1)安装playwright: pip install playwright

  • 2)安装浏览器驱动:

    • playwright install : 会安装 Chromium、Firefox 和 WebKit 的浏览器二进制文件
    • 也可以通过提供参数来安装特定浏览器 :playwright install webkit
    • playwright install --help 可以查看支持哪些浏览器

图片

  • 3)安装pytest插件: Playwright 推荐使用官方的 Playwright Pytest 插件来编写端到端测试。
    • pip install pytest-playwright

观点与案例结合

playwright的元素定位

playwright的元素定位方法有很多,官方文档:https://playwright.net.cn/python/docs/locators  

第一类:get_by_xx定位

1、 get_by_role: 通过角色方式定位元素,适用按钮、复选框、弹框等 ; 常用的参数有两个,第一个是角色名称 role,第二个是元素的文本 name 或者value的值

  • page.get_by_role("link", name="新闻").click()  # 百度新闻链接

  • page.get_by_role("button",name="百度一下").click()  #百度一下按钮

2、get_by_text: 通过元素的文本内容来查找元素,适用于链接文本、或者span标签中的文本等 ;包含两个参数,一个是 text标识定位的文本内容, 第二个是 exact 表示是否精确匹配;

  • 默认是模糊匹配的,要精准匹配就加上参数exact=True;

  • page.get_by_text("百度一下",exact=True).click()

  • page.get_by_text("新闻", exact=True).click()     #会自动忽略文本开头和结尾的空白字符

3、get_by_placeholder: 通过元素的 placeholder 属性来查找元素 ,也就是我们输入框的提示信息。他的参数和 get_by_text相同

  • exact=True:表示是否精确匹配

  • page.get_by_placeholder("请输入邮箱/手机号/账号").fill("zhuque")    #课堂派的用户名输入框

还有很多其他的定位,但是这种定位方法了解即可, 我们只需要使用第二种定位器locator,因为可以实现一切元素定位。

图片

第二类:locator定位器,重点掌握,后面只需要用这个

这个locator方法返回的是一个locator定位器对象 【不是selenium的element对象】:这个locator对象 支持各种操作方法,通过locator定位器来找元素 :

  • 1)id属性定位: page.locator("id=kw").fill("韩梅梅")

  • 2)元素指定属性定位:page.locator("[attribute=value]")

  • 3)CSS selector定位

  • 4)Xpath定位

对css和xpath后面可以自动识别xpath和css selector的表达式;我们先来学习一下css和xpath定位方法:

  • xpath定位(相对) :万能,推荐使用,重点学习。

  • css selector:有弊端,不能支持文本定位,但是xpath可以。而且只支持web页面,app不支持。所以,不如xpath用的多。

1)css选择器元素定位 --了解

1、根据ID定位:两种写法都可以

page.locator("#kw").fill("朱雀")

2、根据className定位: 可以支持多个样式一起写

page.locator(".s_ipt").fill("python")  # 百度搜索框

page.locator(".s-top-right-text.c-font-normal.c-color-t.s-top-right-new").click()  # 百度设置按钮

3、单属性选择定位: 需要其他的属性一起定位,可以用标签[属性名=“属性值”]

page.locator("input[name='wd']").fill("python")   # 百度搜索框

4、多属性选择定位: 如果一个属性不能唯一定位,用个属性组合

page.locator("input[name='wd'][id='kw']").fill("python")

2)xpath元素定位:支持web页面+App页+小程序 ,高级强大,重点学习。属性 +文本+组合方式灵活。

  • xpath其实就是一个path(路径),一个描述页面元素位置信息的路径,相当于元素的坐标

  • xpath基于XML文档树状结构,是XML路径语言,用来查询xml文档中的节点

  • 既可以用于XML,也可以用于HTML(因为XML与HTML结构类似,所以xpath都可以解析)

绝对路径:从根节点开始,一层一层写出来,直到要找到元素。父/子 路径和位置都涵盖了,所以特别不稳定。

  • 从根节点(/)开始,一层一层写出来,直到要找到元素。父/子 【路径和位置依赖】

  • copy xpath :/html/body/div[2]/div[2]/div/div[1]/div[2]/ul/li[1]/a[2] -- 9代单传的路径。

相对路径: 以//开头,相对于某个节点的路径来找通过条件在html里面找。

  • 在页面当中查看xpath表达式,可以匹配多少元素:F12 -- ctrl + F

1、第一种写法:

  • //元素标签名称[@属性=值] # 属性值是不变的。 == 区分一下css选择器,不管是什么属性都是@

  • //元素标签名称[text()=值] # 文本是不变的。

page.locator('//input[@id="kw"]')

2、第二种写法:and or 来组合多个属性和文本 //元[@属性素标签名称=值 and @属性=值 and text()=值]

page.locator('//input[@id="su" and @type="submit"]')

3、第三种方法:contains(text(), 包含的内容) contains(@属性名, 包含的内容)

  • 什么情况下去使用:当你的文本/属性的值过长的情况,可以通过它来简化表达式

    • 注意:写被包含的部分的时候,这部分内容必须是原始值连续的一段字串,不能是间隔的。

  • 属性包含匹配 + 文本包含匹配

page.locator('//标签名[contains(@属性名,'值')]')

4、层级定位: 按照html页面顺序 从上到下定位,//...//...//  

page.locator('//nav[@class="nav-tabs"]//a[@class="nav__item"]')

5、轴定位:如果元素之间有父子关系(儿子找爸爸)、兄弟关系(找哥哥/找弟弟),可以用轴定位

  • 从子孙元素,倒着找父元素或者祖先元素。

  • 从兄弟姐妹元素,顺着关系找到其它的兄弟姐妹。

    • 关系疏理:要找的元素,是已知元素的 xxx 关系。

  • 以下6个轴定位,重点关注标黑的三个:

    • 语法 : //已找到的元素/轴定位名称::元素名称[....]

案例:

page.locator('//span[text()="Tom"]/ancestor::td/following-sibling::td//span[text()="私信 "]')

图片

Playwright 元素定位方法

定位方法

描述

示例代码

适用场景

getByRole

通过 ARIA 角色和可访问名称定位,如按钮、输入框。

javascript<br>await page.getByRole('button', { name: '登录' }).click();<br>

用户交互元素,如按钮、链接。

getByLabel

通过表单控件的关联标签定位。

javascript<br>await page.getByLabel('用户名').fill('testuser');<br>

表单输入框。

getByPlaceholder

通过输入框的占位符文本定位。

javascript<br>await page.getByPlaceholder('搜索...').fill('playwright');<br>

搜索框、表单输入。

getByText

通过元素文本内容定位,支持子字符串或正则表达式。

javascript<br>await page.getByText('欢迎, testuser').isVisible();<br>

非交互元素,如标题、段落。

getByAltText

通过图像的 alt 属性定位。

javascript<br>await page.getByAltText('产品图片').click();<br>

图像、区域元素。

getByTitle

通过元素的 title 属性定位。

javascript<br>await page.getByTitle('帮助').click();<br>

带 title 属性的元素。

getByTestId

通过自定义测试 ID(如 data-testid)定位。

javascript<br>await page.getByTestId('submit-button').click();<br>

稳定定位,推荐优先使用。

locator

使用 CSS 或 XPath 选择器定位。

javascript<br>await page.locator('#username').fill('testuser');<br>await page.locator('//input[@type="password"]').fill('password123');<br>

复杂定位,需谨慎使用。

filter

过滤定位结果,支持文本、子元素等条件。

javascript<br>const items = page.getByRole('listitem').filter({ hasText: 'playwright' });<br>

缩小定位范围,如列表筛选。

and/or

链式定位,结合多个条件。

javascript<br>const button = page.getByRole('button').and(page.getByText('保存'));<br>await button.click();<br>

复杂条件组合。

实战案例

  1. 登录测试

    • 场景:测试电商平台的登录流程,验证用户登录后显示欢迎信息。

    • 代码

      const { test, expect } = require('@playwright/test');
      
      test('登录测试', async ({ page }) => {
        await page.goto('[invalid url, do not cite]');
        await page.getByLabel('用户名').fill('testuser');
        await page.getByLabel('密码').fill('password123');
        await page.getByRole('button', { name: '登录' }).click();
        await expect(page.getByText('欢迎, testuser')).toBeVisible();
      });
    • 结果:某电商平台通过此测试验证登录功能,稳定性提升 30%,用户体验改善。

  2. 搜索功能测试

    • 场景:测试博客网站的搜索功能,验证搜索结果包含关键词。

    • 代码

      test('搜索测试', async ({ page }) => {
        await page.goto('[invalid url, do not cite]');
        await page.getByPlaceholder('搜索...').fill('playwright');
        await page.getByRole('button', { name: '搜索' }).click();
        const results = page.getByRole('listitem');
        await expect(results).toHaveCountGreaterThan(0);
        await expect(results.first()).toContainText('playwright');
      });
    • 结果:某博客网站通过此测试优化搜索功能,测试覆盖率提升 40%。

  3. 复杂场景:购物车测试

    • 场景:测试电商平台的购物车功能,验证添加商品和结账流程。

    • 代码

      test('购物车测试', async ({ page }) => {
        await page.goto('[invalid url, do not cite]');
        const productSection = page.getByRole('region', { name: '产品列表' });
        await productSection.getByRole('button', { name: '加入购物车' }).first().click();
        await page.getByRole('link', { name: '购物车' }).click();
        const cartItems = page.getByRole('listitem').filter({ hasText: '商品' });
        await expect(cartItems).toHaveCount(1);
        await page.getByTestId('checkout-button').click();
        await expect(page.getByText('结账成功')).toBeVisible();
      });
    • 结果:某电商平台通过链式定位和测试 ID 优化购物车测试,稳定性提升 35%。

最佳实践

  • 优先使用 getByRolegetByTestId:基于 ARIA 角色和测试 ID 的定位更稳定,减少 DOM 变化影响。

  • 避免复杂 CSS/XPath:DOM 结构变化可能导致测试失败,推荐简单选择器。

  • 利用自动等待:Playwright 自动等待元素可操作,无需手动设置超时。

  • 过滤和链式定位:使用 filter、and 和 or 缩小范围,提升定位精度。

  • 调试工具:使用 Playwright 的调试器(如 npx playwright test --ui)定位问题。

  • CI/CD 集成:将测试集成到 GitHub Actions 或 Jenkins,自动化运行:

    name: Playwright Tests
    on: [push]
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - uses: actions/setup-node@v2
          with:
            node-version: '16'
        - run: npm install @playwright/test
        - run: npx playwright install
        - run: npx playwright test

社会现象分析

2025 年,UI 自动化测试因单页应用(SPA)和微服务架构的普及而需求激增。根据 [Gartner 2024 报告],80% 的企业将自动化测试视为上线关键环节。Playwright 因其跨浏览器支持(Chromium、Firefox、WebKit)、自动等待机制和强大的定位方法,成为测试领域的明星工具,GitHub 标星数超过 60K。相比 Selenium,Playwright 的稳定性更高,但配置复杂性可能让初学者望而却步。2025 年的趋势显示,AI 驱动的测试工具(如自动生成测试用例)正成为新方向,Playwright 可结合这些技术进一步提升效率。

在现代前端开发中,组件化、虚拟 DOM 结构变化频繁,Selenium 下“脆弱定位”让测试失控。Playwright 提供的“智能定位+等待机制”,大大提升了定位成功率,降低了开发者维护脚本的成本。同时,Role 与 TestId 的推荐策略,也有助于测试团队和前端工程师在协作开发中形成约定。

总结与升华

Playwright 的元素定位方法为 UI 自动化测试提供了强大支持,从基于角色的定位到链式过滤,每种方法都为开发者提供了灵活性和稳定性。在 2025 年的测试浪潮中,掌握这些定位方法不仅能提升测试覆盖率,还能为 Web 应用的质量保驾护航。让我们从现在开始,探索 Playwright 的无限可能,打造卓越的自动化测试体验!

Playwright 的定位方式丰富、语义化强,是自动化测试的真实“万能钥匙”。在选择策略时,请优先考虑:

  • 用户可见性(Text / Role)

  • 稳定性(TestId)

  • 灵活性(CSS / XPath 适度使用)

这样你的脚本才能在“变动世界”中依然运行如常。

在本文章中,我们详细介绍了Playwright框架,并与Selenium进行了比较。介绍了安装配置流程,并通过实战项目展示了其强大元素定位的能力。

通过比较Playwright和Selenium,我们可以看到Playwright在自动化测试领域的优势。其跨浏览器和跨平台的特性,以及对现代Web技术的全面支持,使其成为开发人员和测试人员的首选。

我们鼓励读者在实际项目中尝试使用Playwright框架,体验其简洁的API和出色的性能。无论您是开发人员、测试人员还是质量保证专家,Playwright都将成为您工作中的得力助手。

元素定位,不靠猜拳,而靠语义与策略 —— Playwright让测试“不再盲目”。

“Playwright 定位神器,点燃 UI 测试效率,铸就 Web 应用卓越品质!”


网站公告

今日签到

点亮在社区的每一天
去签到