最强自动化测试框架Playwright-(2)元素定位

2023-11-03

元素定位

定位器是playwright自动等待和重试功能的核心部分。简而言之,定位器表示一种随时在页面上查找元素的方法。

Locators | Playwright Python

如下这些是推荐的

按显式和隐式辅助功能属性进行定位。

使用F12元素拾取工具,可以看到一个元素的name和role。

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

角色定位器包括按钮、复选框、标题、链接、列表、表等

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

按文本内容定位。

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

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

这种方式与selenium的根据文本定位一样

根据label标签的文本进行查找

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

<input type="email" placeholder="name@example.com" />

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

通过其文本替代来定位元素,通常是图像。

<img alt="playwright logo" src="/img/playwright-logo.svg" width="100" />

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

page.get_by_title()

按元素的 title 属性定位元素。

<span title='Issues count'>25 issues</span>

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

 <button data-testid="directions">Itinéraire</button>

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

xpath/css定位

playwright可以使用xpath或者css定位,如果省略了前缀,playwright会自动检测。

但是不建议使用xpath和css,因为页面变化会导致定位方式变化,导致测试用例执行不稳定。

建议使用role或者test id进行定位。

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

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

Locate in Shadow DOM

playwright的定位器默认可以定位到shadow DOM的元素,
除非:

1.使用xpath定位无法穿透 shadow roots
2、shadow roots是closed mode模式的

 <x-details role=button aria-expanded=true aria-controls=inner-details>
<div>Title</div>
#shadow-root
<div id=inner-details>Details</div>
</x-details>

定位方法

page.get_by_text("Details").click() 

 过滤定位

定位器可以使用 locator.filter() 方法按文本进行过滤。它将搜索元素内某处的特定字符串,可能在后代元素中,不区分大小写。您还可以传递正则表达式。

 

Filter by text 

page.get_by_role("listitem").filter(has_text="Product 2").get_by_role(
    "button", name="Add to cart"
).click()

Filter by not having text

# 5 in-stock items
expect(page.get_by_role("listitem").filter(has_not_text="Out of stock")).to_have_count(5) 

 Filter by child/descendant

page.get_by_role("listitem").filter(
    has=page.get_by_role("heading", name="Product 2")
).get_by_role("button", name="Add to cart").click()

Filter by not having child/descendant

expect(
    page.get_by_role("listitem").filter(
        has_not=page.get_by_role("heading", name="Product 2")
    )
).to_have_count(1) 

缩小定位

链接创建定位器的方法(如 page.get_by_text() 或 locator.get_by_role()),以将搜索范围缩小到页面的特定部分。

Matching inside a locator

product = page.get_by_role("listitem").filter(has_text="Product 2")

product.get_by_role("button", name="Add to cart").click()

同时匹配两个条件

button = page.get_by_role("button").and_(page.getByTitle("Subscribe")) 

匹配两个中的一个

new_email = page.get_by_role("button", name="New")
dialog = page.get_by_text("Confirm security settings")
expect(new_email.or_(dialog)).to_be_visible()
if (dialog.is_visible()):
  page.get_by_role("button", name="Dismiss").click()
new_email.click() 

只匹配可见元素

page.locator("button").locator("visible=true").click() 

定位一组元素

计数

expect(page.get_by_role("listitem")).to_have_count(3)

断言一组元素的文本

expect(page.get_by_role("listitem")).to_have_text(["apple", "banana", "orange"])

在列表中获取特定项

使用文本、测试id、下标进行筛选

page.get_by_text("orange").click()

page.get_by_role("listitem").filter(has_text="orange").click()

page.get_by_test_id("orange").click()

banana = page.get_by_role("listitem").nth(1)

连续过滤

row_locator = page.get_by_role("listitem")

row_locator.filter(has_text="Mary").filter(
    has=page.get_by_role("button", name="Say goodbye")
).screenshot(path="screenshot.png")

遍历一组元素

for row in page.get_by_role("listitem").all():
    print(row.text_content()) 

rows = page.get_by_role("listitem")
count = rows.count()
for i in range(count):
    print(rows.nth(i).text_content()) 

evaluate in the pge

rows = page.get_by_role("listitem")
texts = rows.evaluate_all("list => list.map(element => element.textContent)") 

这段代码的作用是将`rows`中的每个元素的文本内容提取出来,并返回一个包含提取出的文本的新列表。

代码中使用了`evaluate_all()`函数,它接受一个函数作为参数,并将该函数应用到`rows`列表中的每个元素上。传递的函数采用了箭头函数的形式,接受一个`list`参数,表示`rows`列表,然后使用`map()`方法遍历列表中的每个元素。

在箭头函数中,又传递了一个函数作为`map()`方法的参数,该函数接受一个`element`参数,表示列表中的每个元素。然后,通过使用`element.textContent`获取每个元素的文本内容。

最后,`list.map(element => element.textContent)`返回一个新的列表,该列表包含了提取出的文本内容。

例如,假设`rows`列表包含三个元素,分别是文本内容为"苹果"、"橙子"和"香蕉"的元素。执行该代码后,将返回一个新的列表:`["苹果", "橙子", "香蕉"]`。

 

不常用的定位器

Other locators | Playwright Python

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最强自动化测试框架Playwright-(2)元素定位 的相关文章

随机推荐

  • Spring 基础教程之一:Spring简介

    明天就要讲传说中的spring了 不知道它是否像老师说的那样简单且神奇 spring的英文翻译是春天 泉水 弹簧 活跃的意思 不知道像我们这样的距找工作还有50天左右的人来说 我们的春天是否到了 在这个春天我们是否能够喝上甘甜的泉水 然后像
  • aps是什么意思_全画幅大还是中画幅大? 为什么说底大一级压死人

    经典摄影教程 总第十期 书接上文 是什么造成了画面的 空间感 其中我们谈到了当我们使用不同焦距的时候 我们的拍摄距离往往也会改变 但是这个焦距说的就是等效焦距 在什么是等效焦距 一文中 也说了等效焦距是因为传感器大小不同产生的讨厌的东西 那
  • Redis零基础小白篇

    一 Redis概述 1 是什么 是存在内存中的数据库 是Key Value数据库 MySQL是关系数据库 2 能干什么 一个程序中大部分操作都是查询 少部分操作是写入 所以用MySQL作存储 Redis作查询 所有查询先查询Redis 没有
  • 用遗传算法(GA)做最优化:找一元及多元函数的最大值

    一元函数 对于如下图所示的一元函数求解其在区间 0 7 内的最大值有多种方式 在本文中分享的是用一种启发式算法 遗传算法来完成这项工作 大家对遗传算法不了解的话可以戳这里看简介 首先介绍我们的主角 也就是目标函数的形式 其定义如下 def
  • Drools规则引擎入门学习记录

    业务开发过程中 对于某些判断性的通用规则是基于if else封装 还是基于策略模式封装 无论以上那种封装出来的方法 只能在单体软件包中共用 且不能无感部署 然而对于业务而言 可能规则改变的比较频繁 例如与营销有关的活动 会频繁的修改商品价格
  • (css必看)禁止用户拖动,禁止选中复制,禁止输入框输入

    目录 特殊的css 下面每一个都必须了解 1 user select属性可以设置是否允许用户选择页面中的图文内容 2 user drag属性可以设置是否允许页面元素拖拽 3 user modify属性可以设置是否允许输入框输入内容 特殊的c
  • xmlHttpRequest的status的值的含义

    转自 http www cnblogs com zhubaoxu archive 2008 03 17 1109315 html 虽然常写ajax方面的东西 但是很少去专门了解xmlHttpRequest的status各个值的含义 只是在用
  • C语言基础知识--static 关键字

    目录 一 static 修饰全局变量 二 static 修饰局部变量 三 static 修饰函数 一 static 修饰全局变量 此用法多出现在由多个源文件组成的项目中 static修饰表示该变量只可在定义该变量的文件下访问该static变
  • MinGW安装教程

    前言 本文主要讲述如何安装 C语言 编译器 MinGW 特点是文章附有完整详细的实际安装过程截图 文字反而起说明提示作用 编写本文的原因始于我的一个观点 图片可以比文字传达更多的信息 也能让其他人更容易理解作者的意图及思想 因此 我将安装
  • luckysheet内网(离线)使用

    luckysheet内网 离线 使用 需要先把有关联网引用的文件 搞下来 const dependScripts https cdn jsdelivr net npm vue 2 6 11 expendPlugins chart onlin
  • [Unity 3D] 求两个向量间的夹角的方法

    1 Vector3 d1 transform forward Vector3 d2 new Vector3 0 3 0 float angle Vector3 Angle d1 d2 2 Vector3 d1 transform forwa
  • 微信小程序实现js控制动画——点击播放动画

    功能需求 点击刷新图标 图标旋转进入Loading状态 加载完毕 动画停止 index wxml
  • JAVA中 IO输入输出流的基本用法和文件复制的案例

    IO 即in和out 也就是输入和输出 指应用程序和外部设备之间的数据传递 常见的外部设备包括文件 管道 网络连接 Java 中是通过流处理IO 的 那么什么是流 流 Stream 是一个抽象的概念 是指一连串的数据 字符或字节 是以先进先
  • npm .npmrc作用

    在执行npm install g cordova ionic时出错 可以修改npm源 npm全名Node Package Manager npmrc文件的作用 就是配置npm源 该文件在C盘用户文件目录下 eg 淘宝源 registry h
  • ORCAD 16.6使用说明及技巧

    1 元器件基本操作 R 翻转 H 左右镜像 V 上下镜像 I 放大视图 O 缩小视图 2 选中工程根文件夹 点击Edit Browse Parts Nets等可查看所有信息 3 元件属性 白色 instance 平坦式 黄色 occuren
  • socket原理以及socket的简单实现

    目录 一 socket学前基础 TCP的三次握手和四次挥手 二 为什么要使用socket 三 什么是socket 四 socket的简单代码实现 服务端 客户端 一 socket学前基础 TCP的三次握手和四次挥手 1 服务端和客户端如果想
  • python怎么绘制渐变图_有没有一种使用Python生成渐变位图的简单方法?

    实现这一点的一种方法是使用matplotlib 正如您在标记中建议的那样 为了做到这一点 我会的使用numpy创建一个NxN数组来表示image gradient 在 创建一个figure 其大小以英寸为单位与圆的半径 image circ
  • 浏览器console几种报错类型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 SyntaxError 语法错误 2 TypeError 类型错误 通常是 is not a function 即 不是一个函数 3 ReferenceError 引用
  • 开启电脑虚拟化功能

    一 查看笔记本是否支持虚拟化 打开任务管理器 同时摁住ctrl alt del这个三个健 选择任务管理器 查看是否开启虚拟机 如果未开启 一 进入BIOS 参考以下按键 开机时按住对应的键进入BIOS 组装机以主板分 华硕按F8 Intel
  • 最强自动化测试框架Playwright-(2)元素定位

    元素定位 定位器是playwright自动等待和重试功能的核心部分 简而言之 定位器表示一种随时在页面上查找元素的方法 Locators Playwright Python 如下这些是推荐的 page get by role 按显式和隐式辅