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

最新,出炉,系列,python,playwright,自动化,测试,等待,浅析 · 浏览次数 : 520

小编点评

**Playwright 自动等待** Playwright 对元素执行操作前,会进行一系列可操作性检查,以确保这些行动按预期运行。它会自动等待所有相关检查通过,然后才执行请求的操作。如果所需的检查未在给定的范围内通过则抛出timeout,操作将失败并显示 TimeoutError。 **自动等待的作用** * 减少脚本稳定性。 * 确保元素操作按预期。 * 提高测试执行效率。 **设置自动等待时间** 可以使用 `page.wait_for_timeout()` 方法设置自动等待时间。例如,以下代码将等待 5 秒: ```python page.wait_for_timeout(5) ``` **其他注意事项** * Playwright 使用 `page.wait_for_timeout()` 方法是因为 `time.sleep()` 在异步操作中无法处理。 * 使用 `wait_for_timeout()` 方法需要指定等待时间,但可以使用 `wait_for_event()` 方法等待事件。 * 使用 `wait_for_load_state()` 方法可以等待元素加载状态。 **示例** ```python # 使用 Playwright 自动等待 5 秒 page.wait_for_timeout(5) # 执行元素操作 page.fill('#kw', "北京-宏哥") page.click("#su") ```

正文

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
check Yes Yes Yes Yes Yes -
click Yes Yes Yes Yes Yes -
dblclick Yes Yes Yes Yes Yes -
setChecked Yes Yes Yes Yes Yes -
tap Yes Yes Yes Yes Yes -
uncheck Yes Yes Yes Yes Yes -
hover Yes Yes Yes Yes - -
scrollIntoViewIfNeeded Yes - Yes - - -
screenshot Yes Yes Yes - - -
fill Yes Yes - - Yes Yes
selectText Yes Yes - - - -
dispatchEvent Yes - - - - -
focus Yes - - - - -
getAttribute Yes - - - - -
innerText Yes - - - - -
innerHTML Yes - - - - -
press Yes - - - - -
setInputFiles Yes - - - - -
selectOption Yes Yes - - Yes -
textContent Yes - - - - -
type Yes - - - - -

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

与《最新出炉》系列初窥篇-Python+Playwright自动化测试-4-playwright等待浅析相似的内容:

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

1.简介 在介绍selenium的时候,宏哥也介绍过等待,是因为在某些元素出现后,才可以进行操作。有时候我们自己忘记添加等待时间后,查了半天代码确定就是没有问题,奇怪的就是获取不到元素。然后搞了好久,或者经过别人的提示才恍然大悟没有添加等待时间。而playwright为了避免我们犯这么low的错误,

《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建

1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了。其实在各大博客和公众号也看到过其相关的介绍和讲解。要不就是不全面、不系统,要不就是系统全面但是人家是收费的。当然了宏哥接下来也可能介绍的不全面或者不系统,能力有限望大家理解。 2.Pla

《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识

1.简介 上一篇宏哥已经将Python+Playwright的环境搭建好了,而且也简单的演示了一下三款浏览器的启动和关闭,是不是很简单啊。今天主要是把一篇的中的代码进行一次详细的注释,然后说一下playwright的API和其他相关知识点。那么首先将上一篇中的代码进行一下详细的解释。 2.代码解释

《最新出炉》系列初窥篇-Python+Playwright自动化测试-3-离线搭建playwright环境

1.简介 有些小伙伴或者童鞋们私信留言说自己是在公司局域网办公,或者公司为了安全对网络管控比较严格(尤其是一些大的国企、央企),总之就是一句话无法连到外网去在线下载,宏哥刚看到留言时觉得这问题还留言问啊,你找个有网的电脑下载好安装包然后安装就可以用了。(第一种情况及解决办法:带要搭建环境的电脑到有网

《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇

1.简介 说到元素定位,小伙伴或者童鞋们肯定会首先想到 selenium 的八大元素定位大法。同理Playwright也有自己的元素定位的方法。今天就给小伙伴或者童鞋们讲解和分享一下Playwright的元素定位方法。 宏哥对UI自动化的理解:定位元素 >操作元素 >断言。 2.定位器 定位器(Lo

《最新出炉》系列初窥篇-Python+Playwright自动化测试-6-元素定位大法-下篇

1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下,在日常中很少用到或者很少见的定位,但是遇到了我们也要会,俗话说:手里有粮心里不慌。 2.阴影定位-Shadow DOM 在做web自

《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇

1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题,那么宏哥就单独写一篇关于iframe网页处理的文章。iframe 是web自动化

《最新出炉》系列初窥篇-Python+Playwright自动化测试-12-playwright操作iframe-中篇

1.简介 按照计划今天就要用实际的例子进行iframe自动化测试。经过宏哥长时间的查找,终于找到了一个含有iframe的网页(QQ邮箱和163邮箱),别的邮箱宏哥就没有细看了。所以今天这一篇的主要内容就是用这两个网页的iframe结合上一篇的理论知识,宏哥给小伙伴或者童鞋们演示一下。 2.QQ邮箱

《最新出炉》系列初窥篇-Python+Playwright自动化测试-13-playwright操作iframe-下篇

1.简介 通过前边两篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe做一个总结,主要从iframe的操作(输入框、点击等等)和定位两个方面进行总结。 2.iframe是什么? iframe 简单来说就是一个 html 嵌套了另外一个 html。在页面元素上最简

《最新出炉》系列初窥篇-Python+Playwright自动化测试-14-playwright操作iframe-番外篇

1.简介 通过前边三篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe的一些特殊情况的介绍和讲解,主要从iframe的定位、监听事件和执行js脚本三个方面进行展开介绍。 2.iframe定位 2.1动态id属性如何定位 有时候,我们可能看到的iframe 的id