为什么要设置元素等待

直白点说,怕报错,哈哈哈!

肯定有人会说,这也有点太直白了吧。

用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了。

如何避免元素未加载出来而导致定位失败 ?

三种方式,强制等待、隐式等待、显式等待!

1、强制等待

就是sleep() ,也叫硬等待;

缺点就是:如果等待时间过长,即使元素已被加载出来了,但还是要继续等,这样会导致整个脚本的执行上会浪费很多时间。

示例代码如下:

# 强制等待案例
driver.get("http://localhost:8080/wait.html")
driver.find_element(By.ID, "wait").click()
time.sleep(3)
text = driver.find_element(By.ID, "green_box").text
print('text is : '+text)

2、隐式等待

WebDriver 提供了三种隐性等待方法:

  • implicitly_wait

识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElementException 异常。

  • set_script_timeout

异步脚本的超时时间。WebDriver 可以异步执行脚本,这个是设置异步执行脚本,脚本返回结果的超时时间。

  • set_page_load_timeout

页面加载时的超时时间。因为 WebDriver 会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么 WebDriver 就会抛出异常。

以上三种都是在整个webDriver生命周期有效,即全局设置,相当于全局变量!

示例代码如下:

def init():
# 最大化操作
driver.maximize_window()
driver.set_script_timeout(60)
# 智能等待60秒,找到元素后立即继续执行,全局生效
driver.implicitly_wait(60)
driver.set_page_load_timeout(60) init()
# 强制等待案例
driver.get("http://localhost:8080/wait.html")
driver.find_element(By.ID, "wait").click()
# 硬等待
# time.sleep(3)
text = driver.find_element(By.ID, "green_box").text
print('text is : '+text)

3、显式等待

就是明确的要等到指定元素(相当于局部变量)的出现或者是某个元素的可点击等条件等到为止,才会继续执行后续操作,等不到,就一直等,如果在规定的时间之内都没找到,就会抛出异常!

显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。

示例代码如下:

# -*- coding: utf-8 -*-
"""
@Time : 2022/10/31 8:12 PM
@Auth : 软件测试君
@File :test_wait.py
@IDE :PyCharm
@Motto:ABC(Always Be Coding)
""" from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager '''
初始化操作
'''
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) def init():
# 最大化操作
driver.maximize_window() init()
driver.get("http://localhost:8080/wait.html")
driver.find_element(By.ID, "wait").click()
# 显示等待案例
# 设置元素等待实例,最多等5秒,每0.5秒查看条件是否成立
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "green_box")))
print('text is : ' + element.text)
driver.quit()
3.1、显示等待需要用到两个类

WebDriverWait和expected_conditions两个类。

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)参数说明:

driver:浏览器驱动

timeout:最长超时时间,默认以秒为单位

poll_frequency:检测的间隔步长,默认为0.5s

ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

3.2、until()和until_not()的方法

until

  • WebDriverWait(driver,10).until(method,message="")
  • 调用该方法提供的驱动程序作为参数,直到返回值为True

method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常

until_not

  • WebDriverWait(driver,10).until_not(method,message="")
  • 调用该方法提供的驱动程序作为参数,直到返回值为False

与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

3.3、expected_conditions类

各种类,达到某种条件,返回True和False,详细参考下表。

3.4、显示等待,自定义等待条件

示例代码如下:

# 设置等待
wait = WebDriverWait(driver, 10, 0.5)
# 使用匿名函数
element = wait.until(lambda diver: driver.find_element(By.ID, 'green_box'))
print(element.text)
driver.quit()

写在最后

其实隐式等待和显示等待在本质上是一致的,只是显示等待多了一个指定元素条件超时时间,在使用场景上,可以使用隐式等待来做一个全局的控制,例如设置全局隐式等待6秒;

如果某个控件比较特殊,需要更长的时间加载,比如十几秒或者更长,就可以使用显示等待对其进行单独处理;

参考文章:

https://blog.csdn.net/qq_36821826/article/details/115668538

Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待的更多相关文章

  1. CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占

    CPU被夺走的三种状态   执行时间久了    IO操作让cpu等待  被优先级高的抢占

  2. Selenium4+Python3系列(五) - 多窗口处理之句柄切换

    写在前面 感觉到很惭愧呀,因为居然在Selenium+Java系列中没有写过多窗口处理及句柄切换的文章,不过也无妨,不管什么语言,其思路是一样的,下面我们来演示,使用python语言来实现窗口句柄的切 ...

  3. selenium webdriver三种等待方法

    webdriver三种等待方法 1.使用WebDriverWait from selenium import webdriverfrom selenium.webdriver.common.by im ...

  4. Selenium中三种等待的使用方式---规避网络延迟、代码不稳定问题

    在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果你不做任何处理的话,代码会由于没有找到元素,而报错.这时我们就要用到wait(等待),而在Selenium中,我们可以用到一共三种等待, ...

  5. Nacos系列:Nacos的三种部署模式

    三种部署模式 Nacos支持三种部署模式 1.单机模式:可用于测试和单机使用,生产环境切忌使用单机模式(满足不了高可用) 2.集群模式:可用于生产环境,确保高可用 3.多集群模式:可用于多数据中心场景 ...

  6. Selenium:三种等待方式

    UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作.但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1.有frame:2.没有设置等待. 因为代码运行速度和 ...

  7. 【转】selenium webdriver三种等待方法

    原文:https://www.cnblogs.com/lgh344902118/p/6015593.html webdriver三种等待方法 1.使用WebDriverWait from seleni ...

  8. selenium的三种等待

    1. 强制等待 最简单粗暴,sleep(xx),不管你浏览器是否加载完了,程序都得等待xx秒,时间一到,再继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式, ...

  9. selenium的三种等待时间

    //隐式等待(20秒以内没哥一段时间就会去找元素,如果没找大也不会报错,过了20s才会报错) //driver.manage().timeouts().implicitlyWait(20, TimeU ...

随机推荐

  1. 一次客户需求引发的K8S网络探究

    前言 在本次案例中,我们的中台技术工程师遇到了来自客户提出的打破k8s产品功能限制的特殊需求,面对这个极具挑战的任务,攻城狮最终是否克服了重重困难,帮助客户完美实现了需求?且看本期K8S技术案例分享! ...

  2. PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

    一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结器队列 ...

  3. OpenJ_Bailian - 3424 Candies (差分约束)

    题面 During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teache ...

  4. 【MySQL】从入门到精通8-SQL数据库编程

    上期:[MySQL]从入门到精通7-设计多对多数据库 第零章:Mac用户看这里: mac终端写MySQL和windows基本相同,除了配置环境变量和启动有些许不同以外. 先配置环境变量,在终端输入vi ...

  5. 基于Vue3实现一个前端埋点上报插件并打包发布到npm

    前端埋点对于那些营销活动的项目是必须的,它可以反应出用户的喜好与习惯,从而让项目的运营者们能够调整策略优化流程提高用户体验从而获取更多的$.这篇文章将实现一个Vue3版本的埋点上报插件,主要功能有 通 ...

  6. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  7. Linux常用基础命令三

    一.ln 软链接 软链接也称为符号链接,类似于 windows 里的快捷方式,有自己的数据块,主要存放 了链接其他文件的路径. 在查看文件目录中,软连接是以'l'开头 创建软链接 ln -s [原文件 ...

  8. 如何将原生微信小程序页面改成原生VUE框架的H5页面

    项目背景: 公司为了实现小程序与H5页面共同覆盖,全面推广.特此想将已有的小程序进行快速改造上线(二周内),研发出H5版本.目前公司前端技术较为薄弱,现有的技术解决方案还停留在JSP. 问题: 如何将 ...

  9. Python 第四次实验

    1.(程序设计)定义函数def GetRandomChar(),返回一个随机的数字或大写或小写字母,每个符号出现的机会相等.调用该函数8次,生成并输出一个8位的验证码.用户输入该验证码,如果验证码正确 ...

  10. Python实验报告——第4章 序列的应用

    实验报告 [实验目的] 1.掌握python中序列及序列的常用操作. 2.根据实际需要选择使用合适的序列类型. [实验条件] 1.PC机或者远程编程环境. [实验内容] 1.完成第四章 序列的应用 实 ...