webdriver 的三种等待方式(强制等待、隐式等待、显示等待)

在自动化测试脚本运行时,WebDriver操作浏览器定位元素有超时时间,超时会抛异常中止脚本。可通过设置等待避免偶然失败,常用等待方式有强制等待、隐式等待和显示等待,文中介绍了三种方式的特点、使用方法及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种:

一、强制等待

 强制等待是利用python语言自带的time库中的sleep()方法:

from time import sleep
sleep(10)

sleep()顾明思义就是睡觉的意思,就是脚本一旦执行到条语句sleep(10)就睡10s,再执行后面的语句,他是一个强制等待的方式,使得整个脚本暂停。但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒。

二、隐式等待

隐式等待相比强制等待更智能,顾明思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。 

driver = webdriver.Chrome()
driver.implicitly_wait(10)

implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完),implicitly_wait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常。隐式等待在自动化测试中的运用,看代码:

from selenium import webdriver
import unittest

class TestBase(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Chrome()   #驱动浏览器
        self.driver.implicitly_wait(10)  #设置隐式等待
        self.driver.maximize_window()    #最大化浏览器

    def test(self):
        print('这是一个测试用例')

    def tearDown(self):
        self.driver.quit()

if __name__=='__main__':
    unittest.main()

但是隐式等待依然存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步。所以,这里webdriver提供了一种更加智能的等待方式:显示等待

三、显示等待

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

#引入WebDriverWait
from selenium.webdriver.support.ui import WebDriverWait
#引入expected_conditions类,并重命名为EC
from selenium.webdriver.support expected_conditions as EC
#引入By类
from selenium.webdriver.common.by import By

#设置等待
wait = WebDriverWait(driver,10,0.5)
wait.until(EC.presence_of_element_located((By.ID,'KW')))

 显示等待需要用到两个类:

WebDriverWait和expected_conditions两个类。

1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:浏览器驱动

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

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

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

WebDriverWait()中的until()和until_not()方法

until

method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常

until_not

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

2、expected_conditions类

各种类,达到某种条件,返回True和False

常用条件:

                       条件                        说明
presence_of_element_located

判断某个元素是否被加到了DOM树里,

并不代表该元素一定可见

visibility_of_element_located

判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0

关于显示等待,也可以自己写条件:

#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))

显示等待是一种智能程度较高的等待方式,可以有效的增强脚本的健壮性,以下条件适用:

  • 当打开一个新页面,执行第一个元素操作的时候
  • 当某一步操作会引发页面的加载,并且加载的内容包含了下一步需要操作的元素。一句话,就是当某个元素有加载过程的时候,就需要加上显示等待。
<think>嗯,我现在需要理解强制等待显示等待等待之间的区别。之前听说过这些概念是在Selenium WebDriver中用来处理页面元素加载的,但具体细节可能记不太清楚。先一个一个理清楚。 首先,强制等待,应该就是Thread.sleep()这样的方法吧?让线程暂停一段时间,不管页面是否已经加载完成。比如设置等待5秒,即使元素提前加载好了,还是要等够5秒。这样可能会浪费时间,特别是在测试用例很多的时候,效率不高。不过它的优点是简单,容易实现,不需要复杂的判断条件。 然后是显示等待,我记得显示等待是针对某个特定元素设置的,会不断检查该元素是否存在或满足某个条件,如果在设定的时间内找到了,就继续执行,否则超时抛出异常。比如用WebDriverWait配合ExpectedConditions,指定最多等10秒,每隔一段时间去检查一次。这样的话,比强制等待更灵活,不会浪费不必要的时间。但可能需要为每个需要等待的元素单独编写代码,稍微麻烦一些。 等待,听起来像是全局设置,一旦设置,会对所有元素查找操作生效。比如设置等待10秒,那么每次查找元素时,如果元素没有立即找到,WebDriver会轮询直到找到元素或超时。这样的话,不需要为每个查找操作单独写等待逻辑,简化了代码。不过缺点可能是,如果页面中有一些元素加载特别慢,等待可能会让整个测试变慢,因为它会对所有元素应用同样的超时时间。另外,等待显示等待一起使用时可能会有冲突,导致等待时间叠加,需要小心处理。 可能还有它们的实现机制不同。强制等待是线程休眠,显示等待是轮询检查条件,等待是在元素查找时自动轮询。使用场景方面,强制等待可能用于简单的调试,或者确定需要固定等待时间的情况;显示等待用于需要精确控制的条件,比如等待某个元素可点击或可见;等待适用于整个测试套件中,大部分元素加载时间比较一致的情况。 但有些地方可能记错了。比如等待是否真的对所有findElement方法都有效,或者是否和显示等待同时存在时会有问题。可能需要查证一下。比如,当等待显示等待同时设置时,实际的等待时间可能是两者的超时时间相加,这可能导致测试时间变长,应该避免同时使用两种等待方式,或者至少注意调整时间。 总结一下,三者主要区别在于: 1. 强制等待:固定时间,无条件等待,简单但低效。 2. 显示等待:针对特定元素和条件,灵活高效,但代码较多。 3. 等待:全局设置,自动应用于所有元素查找,方便但可能不够精确。 在最佳实践中,通常推荐使用显示等待来处理需要等待的情况,避免使用强制等待,而等待可以根据具体情况谨慎使用,或者避免和显示等待混用。</think>以下是强制等待显示等待等待的区别及使用场景的清晰对比: --- ### 1. **强制等待(Thread.sleep)** - **实现方式** 直接让线程休眠固定时间,例如:`Thread.sleep(5000)`(等待5秒)。 - **特点** - **无条件等待**:无论页面是否加载完成,必须等待指定时间。 - **简单但低效**:容易实现,但会浪费执行时间,降低测试效率。 - **适用场景** 仅建议在调试或必须固定等待时使用(如模拟真实用户停顿)。 --- ### 2. **显示等待(Explicit Wait)** - **实现方式** 针对特定元素设置条件,使用`WebDriverWait`配合`ExpectedConditions`,例如: $$WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.id("submit")))$$ - **特点** - **条件驱动**:持续检查元素状态(如可见、可点击),满足条件立即继续执行。 - **精确高效**:避免不必要等待,超时后抛出异常。 - **代码量较多**:需为每个需要等待的元素单独编写。 - **适用场景** 需要精准控制等待条件时(如异步加载元素、动态内容)。 --- ### 3. **等待(Implicit Wait)** - **实现方式** 全局设置一次,作用于所有元素查找操作,例如:`driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)`。 - **特点** - **全局生效**:自动应用于所有`findElement`/`findElements`方法。 - **轮询机制**:在设置时间内持续查找元素,找到后立即返回。 - **潜在风险**:与显示等待混用时,可能导致等待时间叠加(如10秒 + 显示10秒 = 实际20秒)。 - **适用场景** 当页面元素加载时间较统一,且需简化代码时(不建议与显示等待混用)。 --- ### **对比总结** | 类型 | 作用范围 | 触发条件 | 效率 | 代码复杂度 | |----------|---------------|--------------------|--------|------------------| | 强制等待 | 固定时间 | 无条件等待 | 最低 | 简单(单行代码) | | 显示等待 | 特定元素/条件 | 满足条件或超时 | 高 | 较高(需配条件) | | 等待 | 全局元素查找 | 元素存在或超时 | 中 | 简单(全局设置) | --- ### **最佳实践建议** 1. **优先使用显示等待**:处理动态内容或异步加载,精准控制等待条件。 2. **慎用等待**:若使用,避免与显示等待混用,且设置较短超时时间(如2-5秒)。 3. **避免强制等待**:仅在特殊场景(如模拟人为延迟)时使用。 通过合理选择等待策略,可显著提升自动化测试的效率和稳定性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值