《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析

news2025/4/21 9:58:34

1.简介

在介绍selenium的时候,宏哥也介绍过等待,是因为在某些元素出现后,才可以进行操作。有时候我们自己忘记添加等待时间后,查了半天代码确定就是没有问题,奇怪的就是获取不到元素。然后搞了好久,或者经过别人的提示才恍然大悟没有添加等待时间。而playwright为了避免我们犯这么low的错误,它对元素执行操作前,会进行一系列可操作性检查,以确保这些行动按预期运行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的范围内通过则抛出timeout,操作将失败并显示TimeoutError。正是由于playwright添加了默认等待时间才会增加脚本稳定性。

2.自动等待

什么是playwright的自动等待?在官网我们可以看到这样一段话:

Auto-wait. Playwright waits for elements to be actionable prior to performing actions. It also has a rich set of introspection events. The combination of the two eliminates the need for artificial timeouts - the primary cause of flaky tests.

翻译过来的大概意思就是说:自动等待:playwright对元素执行操作前,会进行一系列可操作性检查,以确保这些行动按预期运行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的范围内通过则抛出timeout,操作将失败并显示TimeoutError。

如元素点击操作,在操作元素之前需要预判:

以下是针对每个操作执行的可操作性检查的完整列表:

ActionAttachedVisibleStableReceives EventsEnabledEditable
checkYesYesYesYesYes-
clickYesYesYesYesYes-
dblclickYesYesYesYesYes-
setCheckedYesYesYesYesYes-
tapYesYesYesYesYes-
uncheckYesYesYesYesYes-
hoverYesYesYesYes--
scrollIntoViewIfNeededYes-Yes---
screenshotYesYesYes---
fillYesYes--YesYes
selectTextYesYes----
dispatchEventYes-----
focusYes-----
getAttributeYes-----
innerTextYes-----
innerHTMLYes-----
pressYes-----
setInputFilesYes-----
selectOptionYesYes--Yes-
textContentYes-----
typeYes-----

3.slow_mo

通过前边的学习和实践,想必大家和宏哥有同样的感觉吧:Playwright 打开浏览器运行脚本的速度那就是一个字:快!相对于selenium,playwright执行速度会更快,眨眼间就完事了。因此为了便于我们查看执行的过程,我们可以加上等待来减缓执行,但是与selenium不同,playwright通过slow_mo (单位是毫秒)减慢执行速度,它的作用范围是全局的,从启动浏览器到操作元素每个动作都会有等待间隔,方便在出现问题的时候看到页面操作情况。使用方法如下:

chromium.launch(headless=False, slow_mo=50)
3.1牛刀小试

宏哥就按照上边的方法实践一下,看一下是否真的可以减缓执行速度。

3.1.1参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2023-05-25
@author: 北京-宏哥   QQ交流群:705269076
公众号:北京宏哥
Project: 《《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright自动等待及扩展
'''

# 3.导入模块
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, slow_mo=5000)
    page = browser.new_page()
    page.goto("https://www.baidu.com")
    print(page.title())
    page.fill('#kw', "北京-宏哥")
    page.click('#su')
    browser.close()
3.1.2运行代码

1.运行代码,右键Run'test',控制台输出,如下图所示:

2.代码的执行过程,如下图所示:

4.time.sleep()

与selenium不同,playwright不再支持time.sleep(),而是使用page.wait_for_timeout()来实现等待,当我们调试时需要等待,即可使用该方法。Playwright 在查找元素的时候具有自动等待功能,如果你在调试的时候需要使用等待,你应该使用page.wait_for_timeout(5000) 代替 time.sleep(5)并且最好不要等待超时。

注:请使用 wait( wait_for_timeout) 方法而不是time模块。这是因为我们内部依赖于异步操作,并且在使用时time.sleep(5)无法正确处理它们。

4.1牛刀小试

宏哥就按照上边的方法实践一下。

4.1.1参考代码
# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2023-05-25
@author: 北京-宏哥   QQ交流群:705269076
公众号:北京宏哥
Project: 《《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright自动等待及扩展
'''

# 3.导入模块
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, slow_mo=1000)
    page = browser.new_page()
    page.goto("https://www.baidu.com")
    print(page.title())
    # 等待5秒
    page.wait_for_timeout(5000)
    page.fill('#kw', "北京-宏哥")
    page.click('#su')
    # 等待3秒
    page.wait_for_timeout(3000)
    browser.close()
4.1.2运行代码

1.运行代码,右键Run'test',控制台输出,如下图所示:

2.代码的执行过程,如下图所示:

5.小结

本文主要介绍了一些playwright的使用与selenium有一些不同,我们需要注意不同点,比如playwright默认是无头模式运行以及等待的改变。下一篇文章我们将介绍playwright定位元素的方法。

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

5.1自行设置等待

即使 Playwright 已经做了充分准备,但是也并不完全稳定,在实际项目中依旧容易出现因页面加载导致事件没有生效等问题,为了避免这些问题,需要自行设置等待。

# 固定等待1秒
page.wait_for_timeout(1000)
# 等待事件
page.wait_for_event(event)
# 等待加载状态
page.get_by_role("button").click()
page.wait_for_load_state()

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

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

相关文章

桉木芯建筑模板与其他材质比较有何不同?

在建筑行业中,模板的选择对于确保工程质量和效率至关重要。桉木芯建筑模板作为市场上的一种选择,与其他材质的模板相比,具有独特的优势。能强优品木业作为专业的桉木芯建筑模板生产厂家,其产品充分展示了这一材质的优越性能。 材质…

技术博客官网也是一个不错的学习平台(第411篇)

技术博客官网也是一个不错的学习平台(第411篇) 今天的主题是OSPF 大纲 技术成就梦想51CTO-中国知名的数字化人才学习平台和技术社区 OSPF 概念型问题_wx655f0abb3511b的技术博客_51CTO博客 OSPF协议介绍及配置 - airoot - 博客园 (cnblogs.com) 一、OSPF概述 回顾一下距离矢…

如何实现WinApp的UI自动化测试?

WinApp(WindowsAPP)是运行在Windows操作系统上的应用程序,通常会提供一个可视的界面,用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome,都属于WinApp。常见的WinApp&…

[pingCTF 2023] 闲来无事作个题

谁元旦还打CTF啊,这两周没有比赛,明天才加班,作个已经过去的比赛。好在已经有官方WP,不会的可以看。 PWN without-love-it-cannot-be-seen 这个没有代码属于瞎pwn,随便输入个东西会提示密码不正确,然后输…

逻辑卷使用和扩容

1.逻辑卷管理LVM ( Logical Volume Manager) 是 Linux 下对硬盘分区的一种管理机制 /boot分区用于存放引导文件,不能基于lvm创建 2.分区缺点: 无法动态扩容 必须使用连续的空间 没有备份 逻辑卷 lvm: 可以动态扩容…

设计模式:工厂方法模式(讲故事图文易懂)

目录 简单工厂工厂方法模式 简单工厂 定义:简单工厂由一个工厂根据参数类型决定创建哪种产品的实例。 简单工厂不包含在23种设计模式之内(简单工厂不满足开闭原则,后面会详细讲) 举例:张三去4S店买了车,显…

大二第17周总结——2023年的最后一天

本周,学校安排的是数据结构的程序设计,设计是挺好设计的,小半天搞完了,然后帮室友也搞了。内容在上一个博客。 学习上嘛~ 学了一下websocket,看了下微信小程序........ 今天早上做了一套小米的面试题,不做不知道&…

Java开发框架和中间件面试题(10)

目录 104.怎么保证缓存和数据库数据的一致性? 105.什么是缓存穿透,什么是缓存雪崩?怎么解决? 106.如何对数据库进行优化? 107.使用索引时有哪些原则? 108.存储过程如何进行优化? 109.说说…

按摩上门预约小程序源码系统 开发组合:PHP+MySQL 附带完整的搭建教程

现代生活节奏的加快,人们越来越注重健康与放松。按摩作为传统的舒缓方式,市场需求逐年上升。然而,传统的按摩服务预约方式较为繁琐,用户需拨打热线电话或前往实体店进行预约,这无疑增加了用户的操作成本。因此&#xf…

前端框架前置学习(4) AJAX

同步代码和异步代码 同步代码 浏览器按照我们书写代码的顺序一行一行地执行程序.浏览器会等待代码的解析和工作,在上一行代码完成之后才会执行下一行代码.这被称之为同步程序 逐行执行,需要原地等待结果 异步代码 异步编码技术使得程序可以在执行一个可能长期运行的任务的…

七:Day01_Java9—16新特性

第一章 JDK9 新特性 jdk9是新特性最多的,因为jdk8是一个稳定版本。 1、JDK9新特性概述 模块系统 (Module System) Java9最大特性。它提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API…

数据库——LAMP的搭建及MySQL基操

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机,在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作: (1)登录 MySQL,在 MySQL 中创建用户,并对…

听GPT 讲Rust源代码--src/tools(37)

File: rust/src/tools/clippy/clippy_lints/src/explicit_write.rs 在Rust源代码中,explicit_write.rs这个文件是Clippy的一个lint插件,其作用是检查代码中的write!、writeln!宏使用时的不当或繁琐的情况,并给出相关的警告或建议。 具体来说&…

门控循环单元(GRU)-多输入回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分程序: 四、全部代码数据分享: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译…

Redis为何如此快速?

1. 引言 Redis(Remote Dictionary Server)是一个高性能的键值对存储数据库。它以其出色的性能和灵活的数据结构而闻名,今天就来谈谈redis为什么会这么快。 1.1 Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 IO 和键值对…

【REST2SQL】01RDB关系型数据库REST初设计

0 概念 REST2SQL实现连接数据库,数据库的表或视图即可提供REST的GET\POST\PUT\DELETE请求,SQL可执行SQLECT\INSERT\UPDATE\DELETE语句。 0.1 RDB Relational Database 即关系型数据库(简称 RDB)是一种以关系(即表格…

SpringCloud(H版alibaba)框架开发教程,使用eureka,zookeeper,consul,nacos做注册中心——附源码(1)

源码地址:https://gitee.com/jackXUYY/springboot-example 创建订单服务,支付服务,公共api服务(共用的实体),eureka服务 1.cloud-consumer-order80 2.cloud-provider-payment8001 3.cloud-api-commons 4.…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语,使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验,根据医疗不良事件的事件类型、处理事件的不同部门,灵活设置…

探索小红书笔记API:挖掘数据背后的故事

随着数字化时代的到来,数据已经成为企业和个人决策的重要依据。小红书作为一个流行的社交电商平台,积累了大量的用户数据和内容。通过探索小红书笔记API,我们可以深入挖掘这些数据背后的故事,从而更好地理解用户需求和市场趋势。 …

用C语言函数求x^y-------(C每日一编程)

编写函数,计算x^y&#xff08;x,y都是整数&#xff09;。 参考代码&#xff1a; int fun(int x, int y) {int k 1, i;for (i 1; i < y; i)k k * x;return k; } int main() {int x, y;scanf("%d%d", &x, &y);printf("%d", fun(x, y));retur…