Playwright实战:Locators(定位器)指南

news2025/1/12 5:25:14

Locators

Locators是Playwright自动等待和重试能力的核心部分。简而言之,Locators代表了一种随时在页面上查找元素的方法。

快速指南

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

  • page.getbyrole()通过显式和隐式可访问性属性进行定位。
  • page.get_by_text()用于按文本内容定位。
  • page.get_by_label()通过关联标签的文本定位表单控件。
  • page.get_by_placeholder()通过占位符定位输入。
  • page.getby_alt_text()通过文本替代来定位元素,通常是图像。
  • page.get_by_title()通过元素的title属性定位元素。
  • page.getbytestid()用于根据元素的data-testid属性(可以配置其他属性)定位元素。
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()

定位元素

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

考虑以下DOM结构:

在这里插入图片描述

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

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(),也可以在LocatorFrameLocator类上使用,因此可以将它们链接起来并迭代地缩小定位器的范围。

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()

角色定位器包括 buttons, checkboxes, headings, links, lists, tables等,并遵循W3C对ARIA role, ARIA attributesaccessible name的规范。请注意,许多html元素(如)都有一个隐式定义的角色,该角色由角色定位器识别。

按标签定位

大多数表单控件通常有专用的标签,可以方便地用于与表单交互。在这种情况下,可以使用与标签相关联的page.get_by_label()来定位控件。

例如,考虑以下DOM结构。可以通过标签文本定位输入框,然后填充它:
在这里插入图片描述

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

按占位符定位

输入框可能有占位符属性,以提示用户应输入什么值。可以使用page.get_by_placeholder()来定位这样的输入框。

例如,考虑以下DOM结构。可以通过占位符文本定位输入框,然后填充它:

在这里插入图片描述

page.get_by_placeholder("name@example.com").fill("playwright@microsoft.com")

按文本定位

通过元素包含的文本查找元素。在使用page.get_by_text()时,可以匹配子字符串、精确字符串或正则表达式。

例如,考虑以下DOM结构。可以通过元素包含的文本定位它:

在这里插入图片描述

  • 精确匹配:

    expect(page.get_by_text("Welcome, John")).to_be_visible() # 包含
    expect(page.get_by_text("Welcome, John", exact=True)).to_be_visible() #精确
    
  • 使用正则表达式匹配:

    expect(page.get_by_text(re.compile("welcome, john", re.IGNORECASE))).to_be_visible()
    

还可以通过文本过滤,这在尝试在列表中查找特定项时可能很有用。

按替代文本定位

所有图像都应有描述图像的alt属性。可以使用page.get_by_alt_text()基于文本替代来定位图像。

例如,考虑以下DOM结构。可以通过文本替代定位图像,然后点击它:

在这里插入图片描述

page.get_by_alt_text("playwright logo").click()

按标题定位

使用与标题属性匹配的page.get_by_title()来定位元素。

例如,考虑以下DOM结构。可以通过标题文本定位它,然后检查问题数量:

在这里插入图片描述

expect(page.get_by_title("Issues count")).to_have_text("25 issues")

按测试ID定位

通过测试ID进行测试是最具韧性的测试方式,因为即使属性的文本或角色发生变化,测试仍然会通过。QA和开发人员应定义明确的测试ID,并使用page.get_by_test_id()进行查询。但是,通过测试ID进行测试不是面向用户的。如果角色或文本值对您很重要,那么请考虑使用面向用户的定位器,如角色和文本定位器。

例如,考虑以下DOM结构。可以通过其测试ID定位元素:

在这里插入图片描述

page.get_by_test_id("directions").click()

设置自定义测试ID属性

默认情况下,page.get_by_test_id()将基于data-testid属性定位元素,但您可以在测试配置中或通过调用selectors.set_test_id_attribute()进行配置。将测试ID设置为用于测试的自定义数据属性。

在HTML中,您现在可以使用data-pwa作为测试ID,而不是默认的data-testid

在这里插入图片描述

然后,像平常一样定位元素:

playwright.selectors.set_test_id_attribute("data-pw")

按CSS或XPath定位

如果必须使用CSS或XPath定位器,可以使用page.locator()创建一个定位器,该定位器接受一个描述如何在页面中查找元素的选择器。Playwright支持CSS和XPath选择器,并且如果在省略css=xpath=前缀的情况下会自动检测它们。

XPath和CSS选择器可以与DOM结构或实现相关联。当DOM结构发生变化时,这些选择器可能会失效。示例:

page.locator("css=button").click()
page.locator("xpath=//button").click()

page.locator("button").click()
page.locator("//button").click()

page.locator(
    "#tsf > div:nth-child(2) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input"
).click()

page.locator('//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input').click()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP 核心概念

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

centos7.6 安装nginx 1.21.3与配置ssl

1 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2 下载Nginx wget http://nginx.org/download/nginx-1.21.3.tar.gz3 安装目录 mkdir -p /data/apps/nginx4 安装 4.1 创建用户 创建用户nginx使用的nginx用户。 #添加www组 # groupa…

Homestyler 和 Tripo AI 如何利用人工智能驱动的 3D 建模改变定制室内设计

让设计梦想照进现实 在Homestyler,我们致力于为每一个梦想设计师提供灵感的源泉,而非挫折。无论是初学者打造第一套公寓,或是专业设计师展示作品集,我们的直观工具都能让您轻松以惊人的3D形式呈现空间。 挑战:实现定制设计的新纪元 我们知道,将个人物品如传家宝椅子、…

深度学习知识点:LSTM

文章目录 1.应用现状2.发展历史3.基本结构4.LSTM和RNN的差异 1.应用现状 长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问…

ASP.NET Core 中服务生命周期详解:Scoped、Transient 和 Singleton 的业务场景分析

前言 在 ASP.NET Core 中,服务的生命周期直接影响应用的性能和行为。通过依赖注入容器 (Dependency Injection, DI),我们可以为服务定义其生命周期:Scoped、Transient 和 Singleton。本文将详细阐述这些生命周期的区别及其在实际业务中的应用…

kubeneters-循序渐进Cilium网络(二)

文章目录 概要IP 地址配置接口配置解析结论 概要 接续前一章节,我们还是以这张图继续深入Cilium网络世界 IP 地址配置 通过检查 Kubernetes 集群的当前环境,可以获取实际的 IP 地址和配置信息。这些信息将被补充到之前的网络示意图中,以使…

树莓派设备树编译

上回书讲到: 树莓派 OS 安装 树莓派内核 kernel 编译 今天我们介绍下树莓派设备树如何添加、编译和使用。 设备树初识 设备树(Device Tree, DT)是 Linux 内核用来描述硬件的一种数据结构。它以一种结构化的方式定义了硬件的配置和属性&a…

微信小程序map组件所有markers展示在视野范围内

注意&#xff1a;使用include-points属性不生效&#xff0c;要通过createMapContext实现 <template><view class"map-box"><map id"map" class"map" :markers"markers" :enable-traffic"true" :enable-poi&…

省市区三级联动(后端)

前提&#xff1a;springboot、mybatis-plus、swagger 数据库&#xff1a; 文章顶部 实体类&#xff1a; City package com.itfly.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.time.Loca…

【Axure高保真原型】环形进度条(开始暂停效果)

今天和大家分享环形进度条&#xff08;开始暂停效果&#xff09;的原型模版&#xff0c;效果包括&#xff1a; 点击开始按钮&#xff0c;可以环形进度条开始读取&#xff0c;中部百分比显示环形的读取进度&#xff1b; 在读取过程中&#xff0c;点击暂停按钮&#xff0c;可以随…

CTFshow—文件包含

Web78-81 Web78 这题是最基础的文件包含&#xff0c;直接?fileflag.php是不行的&#xff0c;不知道为啥&#xff0c;直接用下面我们之前在命令执行讲过的payload即可。 ?filephp://filter/readconvert.base64-encode/resourceflag.php Web79 这题是过滤了php&#xff0c;…

Jenkins pipeline 发送邮件及包含附件

Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN &#xff08;保存TOKEN, 后面Jenkins会用到&#xff09; Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题&#xff08;XA模式&#xff09;AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…

Java解析Excel表格

Java解析Excel表格 <!-- Excel 表格解析 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version></dependency>简单使用 // 创建一个读取监听器 ReadListener<E…

Bytebase 3.1.2 - 在 SQL 编辑器中为表、列和 PG 的视图注释显示鼠标悬浮提示

&#x1f680; 新功能 在 SQL 编辑器中为表、列和 PostgreSQL 的视图注释显示鼠标悬浮提示。 IM, Webhook 集成支持 Lark。展示 Redshift 表或视图的定义。 &#x1f514; API 重大变更 弃用脱敏策略 API /v1/{instance}/{database}/policies/masking&#xff0c;改为调用 /v…

C#里使用libxl读取EXCEL文件里的图片并保存出来

有时候需要读取EXCEL里的图片文件, 因为很多用户喜欢使用图片保存在EXCEL里,比如用户保存一些现场整改的图片。 如果需要把这些图片抽取出来,再保存到系统里,就需要读取这些图片数据,生成合适的文件再保存。 在libxl里也提供了这样的方法, 如下: var picType = boo…

NAT 代理服务器

文章目录 1. NAT2. 内网穿透3. 内网打洞4. 代理服务器正向代理服务器反向代理服务器 5. DNS6. ICMP7.测试内网穿透 1. NAT 在ip协议章节&#xff0c;我们说报文转发给路由器时&#xff0c;由于私有IP地址不能出现在公网中&#xff0c;路由器会将报文源IP地址替换为路由器的WAN…

Android - NDK :JNI实现异步回调

在android代码中&#xff0c;通过JNI调用c层子线程执行耗时任务&#xff0c;在c层子线程中把结果回调到android层&#xff0c; C语言小白&#xff0c;请批评指正&#xff01; android层代码&#xff1a; import androidx.appcompat.app.AppCompatActivity;import android.os.…

【Altium】AD使用智能粘贴功能把多个网络标签改成端口

1、 文档目标 使用智能粘贴功能把多个网络标签&#xff08;net lable&#xff09;改成端口&#xff08;port&#xff09; 2、 问题场景 客户有一份原理图&#xff0c;网络用的是net label&#xff0c;没用Port&#xff0c;然后创建一个sheet symbol&#xff0c;但是sheet sy…

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中&#xff0c;我们逆向分析时候通常都不能直接看到软件的明文源代码&#xff0c;或多或少存在着混淆对抗的操作。下面&#xff0c;我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…