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

 更新时间:2022年02月15日 08:35:15   作者:小码哥说测试  
这篇文章主要介绍了Selenium 三种等待方式(强制等待、隐式等待、显示等待),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1、强制等待(sleep)

from time import sleep
sleep(3)  # 强制等待3秒

缺点:由于Web加载的速度取决于测试的硬件、网速、服务器的响应时间等因素。如果等待时间太长,容易造成时间浪费,如果等待时间太短又可能会造成在web还没有加载完所需要定位的element,而出现报错。
由于等待时间无法确定,使用太多的sleep会影响运行速度,大大地降低效率,所以建议测试中尽量少使用强制等待。

2、隐式等待 ( implicitly_wait)

# 隐式等待10s
driver.implicitly_wait(10) 

简介:隐式等待是全局的是针对所有元素,设置等待时间如10秒,如果10秒内出现,则继续向下,否则抛异常。可以理解为在10秒以内,不停刷新看元素是否加载出来。

使用场景:隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。隐式等待存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,仍得等到页面全部完成才能执行下一步。

3、显示等待 ( expected_conditions)

简介:显示等待是单独针对某个元素,设置一个等待时间如5秒,每隔0.5秒检查一次是否出现,如果在5秒之前任何时候出现,则继续向下,一般需要配合该类的 until() 和 until_not() 方法一起用,直到超过设置的最长时间,然后抛出超时错误 TimeoutException,以下介绍几个最常用的方法:

1. 判断element是否可见:visibility_of_element_located(locator) (可见代表element非隐藏,并且element宽和高都不等于 0)

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
# 示例
target = EC.visibility_of_element_located(By.ID,'user')
 
# 配合until()使用(等待元素可见)
# 5表示 最长超时时间,默认以秒为单位; 1表示检测的间隔步长,在等待期间,每隔一定时间(默认0.5秒),调用until或until_not里的方法,直到它返回True或False.
WebDriverWait(driver, 5, 1).until(EC.visibility_of_element_located(By.ID,'user'))
# 配合until_not()使用(等待元素不可见)
WebDriverWait(driver, 5, 1).until_not(EC.visibility_of_element_located(By.ID,'user'))
 
# 在类中封装为一个函数
    def wait_eleLocated(self, loc, timeout=30, poll_frequency=0.5, model=None):
        """
        :param loc:元素定位表达;元组类型,表达方式(元素定位类型,元素定位方法),示例:(By.ID, "kw")
        :param timeout:超时时间
        :param poll_frequency:轮询频率
        :param model:等待失败时,截图操作,图片文件中需要表达的功能标注
        :return:None
        """
        self.logger.info(f'等待"{model}"元素,定位方式:{loc}')
        try:
            start = datetime.now()
            WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located(loc))
            end = datetime.now()
            self.logger.info(f'等待"{model}"时长:{end - start}')
        except TimeoutException:
            self.logger.exception(f'等待"{model}"元素失败,定位方式:{loc}')
            # 截图
            self.save_webImgs(f"等待元素[{model}]出现异常")
            raise

2. 判断某个element是否被加载到dom树:presence_of_element_located(locator) (并不代表该element一定可见)

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 
target = EC.presence_of_element_located(By.ID,'user')

3. 判断某个element中是否可见并且可点击:element_to_be_clickable(locator)

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 
target = EC.element_to_be_clickable(By.ID,'user')

4. 判断某个element是否被选中:element_to_be_selected(element) (一般用在下拉列表)

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 
element = driver.find_element_by_class_name('selector')
EC.element_to_be_selected(element)

到此这篇关于Selenium 三种等待方式(强制等待、隐式等待、显示等待)的文章就介绍到这了,更多相关Selenium 等待方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python opencv检测目标颜色的实例讲解

    python opencv检测目标颜色的实例讲解

    下面小编就为大家分享一篇python opencv检测目标颜色的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • zip在python中的用法小结

    zip在python中的用法小结

    Python中的zip函数是一个非常有用的工具,可以帮助我们同时处理多个可迭代对象,通过使用zip函数,我们可以将多个列表或迭代器中的元素打包成一个个元组,然后返回由这些元组组成的列表,这篇文章介绍zip在python中的用法,感兴趣的朋友一起看看吧
    2024-02-02
  • Python3使用tesserocr识别字母数字验证码的实现

    Python3使用tesserocr识别字母数字验证码的实现

    这篇文章主要介绍了Python3使用tesserocr识别字母数字验证码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python pandas 如何替换某列的一个值

    python pandas 如何替换某列的一个值

    python pandas 如何替换某列的一个值?今天小编就为大家分享一篇python pandas 实现替换某列的一个值方法,具有很好的参考价值,希望对大家有所帮助
    2018-06-06
  • python 如何读取列表中字典的value值

    python 如何读取列表中字典的value值

    这篇文章主要介绍了python 如何读取列表中字典的value值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Python高级特性——详解多维数组切片(Slice)

    Python高级特性——详解多维数组切片(Slice)

    今天小编就为大家分享一篇Python高级特性——详解多维数组切片(Slice),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python阶乘求和的代码详解

    Python阶乘求和的代码详解

    在本篇文章里小编给大家整理的是关于Python阶乘求和的代码实例,有需要的朋友们可以跟着学习下。
    2020-02-02
  • 利用Python生成文件md5校验值函数的方法

    利用Python生成文件md5校验值函数的方法

    这篇文章主要给大家介绍了利用Python生成文件md5校验值函数的方法,文中给出了详细的示例代码,对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Django 接收Post请求数据,并保存到数据库的实现方法

    Django 接收Post请求数据,并保存到数据库的实现方法

    今天小编就为大家分享一篇Django 接收Post请求数据,并保存到数据库的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python 剪绳子的多种思路实现(动态规划和贪心)

    Python 剪绳子的多种思路实现(动态规划和贪心)

    这篇文章主要介绍了Python 剪绳子的多种思路实现(动态规划和贪心),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论