• Web自动化测试进阶:网页中难点之等待机制 —— 强制等待,隐式等待


    为什么要添加等待

    • 避免页面未渲染完成后操作,导致的报错

    经常会遇到报错:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[text()='个人中心']"}

    页面还在加载时,就在进行查收元素,此时元素还没显示加载出来,而报错哈哈

    直接等待

    • 缺点:使用比较死板,难以衡量具体等待时间。有的时候也解决不了等待问题,例如网页因某些原因加载过长
    • 解决方案:在报错的元素操作之前添加等待
    • 原理:强制等待,线程休眠一定时间
    • 演练环境:https://vip.ceshiren.com/
    • time.sleep(3)

    隐式等待

    • 注意:需要在代码一开始时就配置好;隐式等待只能解决元素查找问题,不可以解决元素交互问题
    • 问题:难以确定元素加载的具体等待时间。
    • 解决方案:针对于寻找元素的这个动作,使用隐式等待添加配置。
    • 演练环境:https://vip.ceshiren.com/
    • 原理:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
    1. #设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常
    2. driver.implicitly_wait(3)

    隐式等待无法解决的问题

    • 元素可以找到,使用点击等操作,出现报错
    • 原因:
      • 页面元素加载是异步加载过程,通常html会先加载完成,js、css其后
      • 元素存在与否是由HTML决定,元素的交互是由css或者js决定
      • 隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的交互
    • 解决方案:使用显式等待

    显式等待基本使用(初级)

    • 示例: WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)
    • 原理:在最长等待时间内,轮询,是否满足结束条件
    • 演练环境: https://vip.ceshiren.com/#/ui_study
    • 注意:在初级时期,先关注使用

    总结

    类型使用方式原理适用场景
    直接等待time.sleep(等待时间))强制线程等待调试代码,临时性添加
    隐式等待driver.implicitly_wait(等待时间)在时间范围内,轮询查找元素解决找不到元素问题,无法解决交互问题
    显式等待WebDriverWait(driver实例, 最长等待时间, 轮询时间).until(结束条件)设定特定的等待条件,轮询操作解决特定条件下的等待问题,比如点击等交互性行为
    1. def wait_until():
    2. driver = webdriver.Chrome()
    3. driver.get("https://vip.ceshiren.com/#/ui_study")
    4. WebDriverWait(driver, 10).until(
    5. expected_conditions.element_to_be_clickable(
    6. (By.CSS_SELECTOR, '#success_btn')))
    7. driver.find_element(By.CSS_SELECTOR, "#success_btn").click(

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    在这里插入图片描述

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

  • 相关阅读:
    Python爬虫--Requests 库用法大全
    java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层
    【特征选择】基于教与学算法实现二进制特征选择问题附matlab代码
    mysql经典案例带解析(你没见过的全新版本)55题
    联发科技2023届提前批IC笔试(题目)
    【测试沉思录】12. 可用性保障平台的自动化测试探索与实践
    Spring的setter方法注入和构造器注入的对比
    小程序 VS 公众号、APP的区别在哪?
    python之使用深度学习创建自己的表情符号
    剪切板中,经常用到的gpt编程提问
  • 原文地址:https://blog.csdn.net/2301_78276982/article/details/133825643