【playwright】新一代自动化测试神器playwright+python系列课程18_playwritht元素相关操作_等待元素到某种状态

元素相关操作_等待元素到某种状态

对于自动化测试来说,本质上就是定位元素、操作元素。网页上的元素有不同状态,有些元素本来不在网页的DOM中,经过某一步操作后才出现。有些元素是本来就已经在DOM中但是是隐藏的状态,经过某一步操作后才变成显示状态。如果在元素的没有达到想要的状态就执行脚本操作元素,往往会导致脚本执行失败,为了提示自动化测试的稳定性,我们往往需要在元素达到某个指定的状态再执行相应的脚本,这样自动化测试脚本的稳定性就会得到提升。
如果我们想让元素到达指定的状态再下一步操作,有两种方式:
一种是使用page.wait_for_selector() 方法。
还有一种是先定位元素,再使用wait_for() 方法也可以等待元素到达指定的状态
page.wait_for_selector() 方法
wait_for_selector() 方法部分源码

  def wait_for_selector(self,selector: str,*,timeout: typing.Optional[float] = None,state: typing.Optional[Literal["attached", "detached", "hidden", "visible"]] = None,strict: typing.Optional[bool] = None) -> typing.Optional["ElementHandle"]:

state 参数可以设置等待状态,用四个状态:“attached”, “detached”, “hidden”, “visible”。

1.等待元素出现在DOM中

page.wait_for_selector("定位方法", state='attached')

2.等待从DOM中移除

page.wait_for_selector("定位方法", state='detached')

3.等待元素可见

page.wait_for_selector("定位方法", state="visible")

4.等待元素不可见

page.wait_for_selector(“定位方法”, state=‘hidden’)
如果没有传 state 参数,默认情况下是等待元素可见 visible
page.wait_for_selector(“定位方法”)

wait_for_selector()方法
我们以下图中的提示窗口中的确定按钮为例。整个提示窗口默认时不在DOM中的,在点击登录按钮登录失败后系统才会弹出这个提示窗口,这个窗口中的元素才会显示在DOM中。我们就以提示窗口中的确定按钮为例看一下wait_for_selector()的使用。

在这里插入图片描述

项目实践代码

'''
author: 测试-老姜   交流微信/QQ:349940839
欢迎添加微信或QQ,加入学习群共同学习交流。
QQ交流群号:877498247
'''from playwright.sync_api import Playwright, sync_playwright, expect
playwright = sync_playwright().start()
browser = playwright.chromium.launch(headless=False, args=['--start-maximized']) #默认无头模式,设置浏览器最大化
context = browser.new_context(no_viewport=True) # 创建上下文,相当浏览器于实例化,即打开浏览器
page = context.new_page() # 打开一个新标签页
page.goto("http://127.0.0.1:8080/oa/") # 打开网址
page.wait_for_timeout(2000)
page.locator("input[name=\"loginId\"]").fill("sup")
page.get_by_role("button", name="登录").click() #点击登录后会弹出提示信息框
ele = page.wait_for_selector('[value="确定"]', state="attached") # 等待确定按钮出现
page.wait_for_timeout(2000)
ele.click() # 点击确定后,确定按钮会消失
page.wait_for_selector('[value="确定"]', state="detached") # 等待确定按钮消失
context.close()
browser.close()

如果等不到对应的元素状态,默认30秒会报超时异常。也可以自己设置timeout时间
如下设置,判断元素5秒内从DOM中移除

page.wait_for_selector('[value="确定"]', state="attached",timeout=5000)

wait_for() 方法
另外一个先定位元素,再使用wait_for() 方法也可以等待元素到达指定的状态。
将上面的代码稍作修改就可以了

'''
author: 测试-老姜   交流微信/QQ:349940839
欢迎添加微信或QQ,加入学习群共同学习交流。
QQ交流群号:877498247
'''from playwright.sync_api import Playwright, sync_playwright, expect
playwright = sync_playwright().start()
browser = playwright.chromium.launch(headless=False, args=['--start-maximized']) #默认无头模式,设置浏览器最大化
context = browser.new_context(no_viewport=True) # 创建上下文,相当浏览器于实例化,即打开浏览器
page = context.new_page() # 打开一个新标签页
page.goto("http://127.0.0.1:8080/oa/") # 打开网址
page.wait_for_timeout(2000)
page.locator("input[name=\"loginId\"]").fill("sup")
page.get_by_role("button", name="登录").click() #点击登录后会弹出提示信息框
page.locator('[value="确定"]').wait_for(state='attached')# 等待确定按钮出现
page.wait_for_timeout(2000)
page.locator('[value="确定"]').click() # 点击确定后,确定按钮会消失
ele = page.locator('[value="确定"]').wait_for(state="detached") # 等待确定按钮消失
context.close()
browser.close()

wait_for() 方法 和 wait_for_selector()使用区别:
• page.locator(‘定位元素’).wait_for() 返回的是None,后面不能继续操作元素
• page.wait_for_selector(“定位方法”) 返回的是locator 对象,后面可以继续操作元素

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

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

相关文章

JVM知识总结

1.概述 JVM指的是Java虚拟机,本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,作用是为了支持跨平台特性。 功能: 装载字节码,解释/编译为机器码 管理数据存储和垃圾回收 优化热点代码提升效率 …

uniapp中uview组件库的NoticeBar 滚动通知 使用方法

目录 #平台差异说明 #基本使用 #配置主题 #配置图标 #配置滚动速度 #控制滚动的开始和暂停 #事件回调 #API #Props #Events 该组件用于滚动通告场景,有多种模式可供选择 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√…

C++初入(四)

1.万能头文件 #include <bits/stdc.h> 里面包含了大量我们日常所需的头文件&#xff0c;如果使用它&#xff0c;我们就可以减少大量时间去写头文件&#xff0c;但是其实在平常练习和实际运用中&#xff0c;该头文件几乎没有实际价值&#xff0c;原因&#xff1a;1.里面…

web蓝桥杯真题--8、和手机相处的时光

介绍 现在都提倡健康使用手机&#xff0c;那么统计一下在一周中每天使用手机的情况吧&#xff01;本题使用 ECharts 实现统计手机使用时长的折线图&#xff0c;但是代码中存在 Bug 需要你去修复。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目…

【数据结构】平衡树

实现功能&#xff1a; 插入数值删除数值查询某排名的数字查询某数值的排名查询前驱后继 const int N 100010, INF 1e8;int n; struct Node {int l, r; // 左右子结点编号int key, val; // key:结点本身的值 val:为了使二叉树平衡的随机数int cnt, size; // cnt:当前结点的数…

Windows NT 3.5源代码已编译!

2020年5月&#xff0c;Windows NT 3.5 build 782源代码被泄露。然而&#xff0c;它缺少很多文件&#xff0c;包括编译器、链接器、头文件等。大多数这些工具都可以从 Windows NT 3.5 的 SDK 和 DDK 中应用&#xff08;您也可以临时处理 NT 3.51 的 DDK 文件&#xff0c;但之后根…

【Filament】材质系统

1 前言 本文主要介绍 Filament 的材质系统&#xff0c;官方介绍详见 → Filament Materials Guide。材质系统中会涉及到一些空间和变换的知识点&#xff0c;可以参考&#xff1a;【Unity3D】空间和变换、【Unity3D】Shader常量、变量、结构体、函数、【OpenGL ES】MVP矩阵变换、…

Nsis打包Unity Exe文件(通用)

Nsi 脚本 !include "MUI2.nsh"#使用现代UI Unicode true #使用Unicode !define EXENAME "exeName" #定义常量 exe名称 !define SHORTCUT "快捷方式名称" #定义桌面快捷方式的中文名称Name ${EXENAME} #安装程序的title OutFile "${EXENAME…

python/c++ Leetcode题解——2744. 最大字符串配对数目

方法一:两重循环枚举 思路与算法 我们可以直接使用二重循环,枚举给定的数组 words 中的 words[i] 和 words[j] 是否可以匹配。 由于题目规定了数组 words 中包含的字符串互不相同,因此在枚举时,只要保证 i<j,那么每个字符串最多匹配一次。 代码 C++: class Solut…

react-app框架——使用monaco editor实现online编辑html代码编辑器

文章目录 ⭐前言&#x1f496;react系列文章 ⭐配置monaco-editor&#x1f496;引入react-monaco-editor&#x1f496;引入react-app-rewired&#x1f496;通过config-overrides.js添加monaco插件配置 ⭐编辑代码的react页面配置&#x1f496;扩展 可自定义配置语言 ⭐效果⭐总…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第一天-C++概述和基础(物联技术666)

网盘链接:https://pan.baidu.com/s/1TKdHdeuDI8XPaakepvSLZQ?pwd=1688 提取码:1688 上午:C++概述 下午:C++基础 教学内容: 1、面向对象:程序=(对象+对象+…) 对象=(算法+数据结构) 2、类与对象: 对象是现实世界中的一个实体,其特征是: • 每一个对象必须…

Salesforce生成式AI聊天机器人「Einstein Copilot」,将于2月发布!

Spring 24宣布&#xff0c;期待已久的Einstein Copilot将于2024年2月落地Salesforce。该生成式AI聊天机器人将用于整个Salesforce产品套件&#xff0c;帮助企业做出更明智的决策&#xff0c;从而改善客户体验。 Einstein Copilot应用于CRM应用程序中&#xff0c;智能回应任何用…

高效实践,JavaScript全屏和退出全屏操作示例

背景 在项目中出现了一个需求&#xff0c;需要实现将页面投屏到屏幕上&#xff0c;并能够进行开启全屏和退出全屏的操作。 尽管网上有许多第三方开源库可供使用&#xff0c;但由于后续业务场景的不确定性&#xff0c;修改源代码可能带来较大的成本和风险。鉴于全屏功能的实现…

机器学习之伯努利分布及二项分布

伯努利分布:又称两点分布或0-1分布,其样本空间只有两个点,一般取{0,1},不同的伯努利分布只是取到这两个值的概率不一样。伯努利分布只有一个参数p(用描述取1的概率),记作 B e r n o u l l ( p ) Bernoull(p) Bernoull(p)或 X X X~ B ( p ) B(p) B(p)读作X服从参数为p的…

valgrind being installed on Arm platform

valgrind安装: tar -jxvf valgrind-3.12.0.tar.bz2 cd valgrind-3.12.0 ./configure make sudo make install2.在ARM的板子上运行valgrind, 程序出现valgrind Fatal error at startup: a function redirection的错误提示。查找了下&#xff0c;发现是因为libc或ld.so库进行过s…

.net core 6 使用注解自动注入实例,无需构造注入 autowrite4net

像java使用autowrite一样使用 1、前提先注册到ioc容器当中 builder.Services.AddScoped 2、nuget引入AutoWrite4Net 3、启用 //启用自动注入 app.UseAutoWrite(); 4、在类上使用注解 [StartAutoWrite] public class NacosController : ControllerBase 5、实例上使用注解 …

2.mac 安装 Visual studio code 整合go开发

目录 概述前置下载关键命令整合C#go配置go插件常见的go工具安装测试 结束 概述 mac 安装 Visual studio code 整合go开发 相关前置文章 go安装及相关配置 文章 前置 官网速递 mac 系统高于等于 10.15.x 可以直接最新版本 我的系统是 10.13 &#xff0c;所以只能安装此版本…

python list.sort方法和内置函数sorted

list.sort 方法会就地排序列表&#xff0c;也就是说不会把原列表复制一份。这也是这个方法的返回值是 None 的原因&#xff0c;提醒你本方法不会新建一个列表。在这种情况下返回 None 其实是Python 的一个惯例&#xff1a;如果一个函数或者方法对对象进行的是就地改动&#xff…

Nginx 如何实现负载均衡?

Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。由于其具有丰富的功能和出色的性能&#xff0c;Nginx 广泛应用于 Web 开发、负载均衡、反向代理等场景。在负载均衡方面&#xff0c;Nginx 可以实现基于轮询、IP_HASH、URL_HASH 和…

Kubernetes网络模型概述

Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管这些Pod是否运行在同一个Node中&#xff0c;都要求它们可以直接通过对方的IP进行访问。由于Kubernetes的网络模…