selenium中的三种等待方法

Selenium 自动化 —— 四种等待(wait)机制 本文介绍了4种等待机制(包括默认的),有了这些等待,可以大大的提高我们测试的准确性和稳定性。这几种机制没有哪个最好,我们需要根据实际的情况选择最合适的等待。 阅读详情

在selenium中,当我们定位的元素由于网络原因还没加载出来,浏览器找不到我们要定位的元素就会报错。等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,常用的等待方法有:
sleep() ——————————强制等待
implicitly_wait() —————— 隐式等待
WebDriverWait() —————— 显示等待

sleep(): 强制等待n秒。

Python本身的函数,包含在time包中,使用前需要导入time包。执行 sleep()后线程休眠,而另外两种线程不休眠。固定的等待,常用于演示,调试,初学者观察效果。实际项目中不建议使用这种等待,由于网络的好坏导致等待时间不确定,如果设置的等待时间不足够长,元素找不到会报错,如果设置的等待时间过长,保证元素可以找到,但其实可能用不了这么久。这种等待方法十分笨拙,无论页面加载得如何,都必须等待n秒,可以说是十分不智能了。
但是强制等待也不是一无是处,比如界面操作完要关闭,但是最后你提交了一些数据,如果非常快的退出浏览器会丢失请求。那就需要强制等待一定时间,这个跟隐式等待还是显示等待都无关。再比如当我们没有找到元素而报错,定位问题时,可以先用sleep()来尝试一下,确定是否是由于等待时间的问题没有找到元素,如果是的话就可以用显示等待来代替。

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
sleep(5)
ele = driver.find_element_by_id('kw')
ele.clear()
sleep(5)
ele.send_keys('淘宝官网')
sleep(5)
driver.quit()

implicitly_wait():隐式等待

原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素 他是全局等待。是对页面中的所有元素设置加载时间。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素提前结束等待。如果超出了设置时间还未找到定位元素则抛出异常。但如果页面本身包含一个超大视频之类的文件,就算我们需要定位的元素在最开始已经加载出来,却依旧要等待所有文件加载结束之后,脚本才能继续执行,依旧算是有些弊端。implicitly_wait(最大等待时长)默认参数的单位为秒。如果在代码中你设置了隐式等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。用的时候直接用,不需要导入任何包。比如:driver.implicitly_wait(10)这样子,具体所有的会在下面的代码中有的。
缺点:隐式等待对于有些条件无法生效,比如url的改变,窗口的延迟新增,动态属性延迟加载……

WebDriverWait():显式等待

显示等待是Selenium客户可以使用的命令式过程语言。主要思想是最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在(默认检测频率为0.5s),若存在则提前结束等待。若超时未找到则报错。默认抛出异常为:NoSuchElementException。这种等待比隐性等待更智能了一些,无视整个页面的加载,只要需要的元素存在了,就结束等待。显示等待不仅针对元素定位有效,而且可以针对某种行为(url的改变,属性的延迟加载)看它是否具备了一定的特征,就开始有所动作了。
用的时候需要导入WebDriverWait包。from selenium.webdriver.support.wait import WebDriverWait。函数详细介绍:WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:浏览器驱动
timeout:最长等待时间,默认以秒为单位
poll_frequency:监测的时间间隔,默认为0.5秒
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
WebDriverWait一般有until和until_not方法配合使用
until(method,message)
until_not(method ,message)

一般在实际工作脚本中我们要隐式等待+显示等待配合一起使用。至于为什么还要感谢我有一次使用了显示等待来代替隐式等待查找元素,结果就报错了。原因在于我只管了“登录”按钮(下面的例子里自己体会一下)以最有效的方式找到使用了显示等待,忽略其他要查找元素没有了隐式等待。所以在查找下一个按钮“账号登录”时候就报错了。正确的方式应该是隐式等待和显示等待一起用。隐式等待作用于全局,确保每一个你查找的元素都能够有足够的load时长,以便找到它使脚本正常运行。显示等待作用于你当前使用函数查找的这个元素,确保它快速高效的找到,显示等待不会管其他你要查找的元素的。

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
url = 'https://www.youkuaiyun.com/'
login_text = '登录'
account_login = '账号登录'
account = '自己注册一个'
pwd = '自己注册一个'

# 显式等待 得到这个元素在多长时间内
# 想要查找哪一个元素就可以将它抽象成一个函数
def get_ele_time(driver, times, func):
    return WebDriverWait(driver, times).until(func)

def login_test():
    # 实例化浏览器对象 打开浏览器
    d = webdriver.Firefox()
    # 打开项目URL
    d.get('https://www.youkuaiyun.com/')
    # 将浏览器窗口最大化
    d.maximize_window()
    # 隐式等待作用于全局
    d.implicitly_wait(15)
    # 找到元素登录按钮login_text = '登录'
    # d.find_element_by_link_text(login_text).click()
    # 调用显示等待的函数
    ele_login = get_ele_time(d, 5, lambda d: d.find_element_by_link_text(login_text))
    ele_login.click()
    # time.sleep(10)
    # 由于网页重新跳转了页面,driver需要切换作用域
    d.switch_to.window(d.window_handles[-1])
    # 找到元素账号登录超链接account_login = ‘账号登录’
    d.find_element_by_link_text(account_login).click()
    account_ele = d.find_element_by_id('all')
    account_ele.send_keys('')
    account_ele.clear()
    account_ele.send_keys(account)
    pwd_ele = d.find_element_by_id('password-number')
    pwd_ele.clear()
    pwd_ele.send_keys(pwd)
    d.find_element_by_class_name('btn-primary').click()
    time.sleep(5)
    try:
        text_err = d.find_element_by_id('js_err_dom').text
        if text_err == '用户名或密码错误':
            print(text_err)
    except:
        print('Account and Pwd Right!')
    d.quit()

if __name__ == '__main__':
    login_test()


不要害怕显式等待的函数难,你就记住这两行代码就可以了。

# 得到某一个元素需要的时间
def get_ele_time(driver, times, func):
    return WebDriverWait(driver, times).until(func)
# 在你想用显式等待查找元素时候调用这个函数,  
ele_login是你要查找的这个元素。里面的driver, times, 自己对应写。
func照搬,只需要把后面的d.find_element_by_link_text(login_text)变一下,
你自己用什么方法查找元素的就行了。
ele_login = get_ele_time(d, 5, lambda d: d.find_element_by_link_text(login_text))

好了,我也是体会好久才理解到这样子,写的不对的还请给我指正。希望对大家有所帮助~~

【Selenium】一篇说清楚三大等待❗️硬等待 隐式等待 显示等待 WebDriverWait(driver,5)------表示:等待5秒,还有第三个参数,不传的话默认500毫秒,即:每0.5秒轮训查找一次。每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,不存在则继续等待,直到找到或超时。缺点:设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待。long time:等待时长数字, TimeUnit unit:等待时长单位。如:设置等待时间为5秒,在第3秒找到元素,不再继续等待。 阅读详情

相关推荐

Selenium 显示等待、隐式等待及流畅等待

因为它是一个指示浏览器做什么的进程外库,而且web平台本质上是异步的,所以WebDriver不跟踪DOM的实时活动状态。—是保证同步的,因为直到命令在浏览器中被完成之前函数调用是不会返回的(或者回调是不会在回调形式的语言中触发的)。等待条件可以根据您的需要进行定制。和隐式等待混合在一起会导致意想不到的结果,就是说即使元素可用或条件为真也要等待睡眠的最长时间。当条件为true且阻塞等待终止时,条件的返回值将成为等待的返回值。用户可以配置等待来忽略等待时出现的特定类型的异常,例如在页面上搜索元素时出现的。

C'mon的博客 1094

selenium之三种等待方式

selenium的三种等待方式:强制等待,显示等待,隐式等待

weixin_48323589的博客 2496

从零开始,用MATLAB/Simulink手把手搭建一个无刷直流电机(BLDC)的控制模型

本文详细介绍了如何使用MATLAB/Simulink从零开始搭建无刷直流电机(BLDC)控制模型。通过可视化建模方法,避开繁琐的数学推导,直接构建三相逆变器、电机本体参数化模型、霍尔传感器与换相逻辑实现,以及速度闭环控制设计。文章还提供了PID控制器整定、抗饱和处理和系统调试的实用技巧,帮助工程师快速掌握BLDC控制系统的仿真与实现。

weixin_27741699的博客 254

Selenium等待机制之显示等待

Selenium等待机制之显示等待

weixin_53782558的博客 3499

细节增强卷积DEConv详解及代码复现

这种预训练模型能够捕捉图像的基本特征,为后续的端到端训练提供良好的初始参数。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。

hasakie的博客 1910

保姆级教程:用STM32CubeMX配置GD32的CAN总线(含异常处理)

本文提供了一份详细的STM32CubeMX配置GD32 CAN总线开发指南,涵盖从HAL库移植到异常处理的全过程。重点解析GD32与STM32在CAN总线初始化、报文发送优先级处理等方面的关键差异,并提供优化代码维护与版本控制的实用策略,帮助开发者高效完成项目迁移。

onion的博客 829

【02】Selenium+Python 三种等待方法

会在指定时间内等整个页面加载完成才会执行下一步,但有时元素在页面加载完之前就已经出现了,所以不推荐使用隐式等待,会增加脚本运行时间。expected_conditions 提供了一系列用于等待特定条件的方法,用于检查等待时间内元素是否满足某些条件。会在指定时间内 判断条件是否成立,如果超时条件不成立,会抛出异常。页面加载元素需要时间,如果元素还未加载成功就执行脚本,会找不到指定的元素。实例,指定时间内,等待 打开左侧菜单栏图标 出现, 出现后点击。方法,可以指定一个条件,当条件为真或超时时,等待结束。

qq_42755008的博客 1192

别光看原理图了!手把手教你用Altium Designer搞定STM32F411最小系统的PCB布局(附电源/晶振/复位电路实战)

本文详细介绍了使用Altium Designer进行STM32F411最小系统PCB布局的实战技巧,涵盖电源分配网络优化、高速信号布线及系统级布局策略。通过规范的工程结构建立、关键设计规则预设和核心电路模块布局,帮助工程师提升PCB设计效率与信号完整性。特别针对STM32最小系统的电源、晶振和复位电路提供了专业解决方案。

weixin_42653691的博客 168

python自动化测试selenium核心技术三种等待方式

​​UI自动化测试过程中,可能会出现因测试环境不稳定、网络慢等情况,如果不做任何处理的话,会出现无法定位到特定元素而报错,导致自动化测试无法顺利执行。

软件测试技术资源分享官 1206

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5051

Ardupilot无人船(车)mavros自主控制

rover 4.4。

超维空间科技的博客 3229

自动化测试系列-Selenium三种等待详解

第一种也是最简单粗暴的一种办法就是强制等待sleep(time),强制让程序等time秒时间,不管程序能不能跟上速度,还是已经提前到了,都必须等time时长。这种叫强制等待,不管你浏览器是否加载完了,程序都得等待5秒,5秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。

1506

raw (R/G, B/G) 色度域从白点筛选到 mired 直方图的完整构建流程

raw 域用draw​δraw​筛出白点后,。,与 CIE uv 域流程逐步对应。

大熊 39

Python selenium 三种等待方式详解

一、显示等待(WebDriverWait) 显示等待是等某个元素加载后再执行后续代码,超过设置的时间,然后跑出TimeOutException from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWa...

YYece的博客 527

全景相机APP

以下是一款**全景相机APP**的完整源码,支持全景照片拍摄(多帧拼接)、全景预览、鱼眼矫正、图片保存/分享、360°全景查看等核心功能,基于Android原生Camera2 API(替代过时的Camera API) + OpenCV(图像拼接) + GLSurfaceView(全景预览)实现,适配Android 8.0+设备,可直接编译运行。runOnUiThread(() -> tvFrameCount.setText("已拍摄:" + frameCount + "帧"));// X轴旋转(上下)

寒寒豆豆软件公司的博客 180

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

selenium三种等待方式详解

在UI自动化过程中,常遇到元素未找到,代码报错的情况。这种情况下,需要用等待wait。

zhangsiyuan1998的博客 1022

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

selenium之WebDriverWait类(等待机制)

在自动化测试脚本的运行过程中,可以通过设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种: 一、固定等待(time) 固定待是利用python语言自带的time库中的sleep()方法,固定等待几秒。这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用。(注:脚本调试过程时,还是可以使用的,方便快捷) from selenium import webdriver import time #驱动浏览器 driver = webdriver.Chrome() #设置窗口最

编辑编辑器 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

selenium中三种等待方式:sleep,implicitly_wait,WebDriverWait

三种等待方式:sleep 强制等待, sleep,设置等待多长时间,就要等待多长时间。通常使用这个等待方式的场景为,静态元素的加载,不需要从服务器上请求,可以很笃定的知道,多少时间之内,这个元素肯定会加载出来。 比如百度首页的登录按钮。点击登录时,会弹出登录窗口。但这个窗口其实在访问百度首页时就已经加载好了,点击登录时,并不是从服务器上请求再加载,而是直接加载静态页面,不受网速的影响,3s之内,肯定可以加载完成: from selenium import webdriver # 导入sleep from

努力是为了让自己更加有方向 1万+

Selenium三大等待详解

Selenium三大等待

huace3852的博客 1444

Selenium自动化测试:设置等待时间

固定等待sleep与隐性等待implicitly_wait尽量少用,它会对测试用例的执行效率有影响。

HUA6911的博客 1391

selenium等待的三种方法

selenium等待的三种方法 隐式等待 隐式等待要等页面全部加载完成后才会开始查找元素.缺点是效率低. 强制等待 代码暂停 显式等待 只等待指定的元素加载完成.效率比较高. 显示等待示例代码 from selenium.webdriver.support.ui import WebDriverWait def ele_wait(driver, loc): """ WebDriverWait(driver,timeout=20,poll_frequency=0.5) WebDrive

教Linux的李老师 571

selenium三大等待_智能等待

WebDriverWait(会话对象, 超时时长(秒),去查看条件的周期默认0.5).until_not(条件)selenium3当中,每一个条件是以类的形式实现的。每一个类都有__init__,selenium4当中,每一个条件是以函数的形式实现的。每一个函数都有一个_predicate内部函数。闭包使用显性等待的时候,先确定你的条件是什么。然后再去使用显性等待。等待效果只有一次,不像隐性等待全局可用。比较多的用法:显性等待 + 短暂的sleep。

2401_87378769的博客 517

【转】java-selenium三种等待方式

方式1: 线程等待:Thread.sleep(xxxx) 只要在case中加入sleep就会强制等待设置的时间后才会执行之后的命令,这种等待一般适用于调试脚本的时候。 java代码: //等待3秒 Thread.sleep(3000); //完全退出浏览器 driver.quit(); 方式2: 隐试等待:driver.manage().timeouts()...

diaoerxiao0394的博客 262

软件测试:Selenium三大等待(详解版)

此方法与visibility_of_element_located判断结果相同,只是传递参数不同,visibility_of传元素,visibility_of_element_located传元组。16)frame_to_be_available_and_switch_to_it:判断frame是否可以切换(switch_to.frame())。8)visibility_of_element_located:判断定位的元素是否存在,只能判断可见元素,存在返回true,不存在返回false。

HUA1211的博客 1501
上一篇: Linux之CentOS的网络问题
下一篇: pycharm中安装requests报错信息:CondaError:Cannot link a source that does not exist.
EVE จุ๊บ
博客等级 码龄8年 46粉丝 88原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值