• 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(

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

    在这里插入图片描述

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

  • 相关阅读:
    ASP.net数据从Controller传递到视图
    集团管理者培训大会-总结
    uni-app:实现request请求的递归(设置request请求的访问次数),并且调用自定义方法给出返回值
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宿舍管理系统8n6jf
    通达信matlab接口如何读取数据?
    动态内存管理
    JavaScript基础语法(类型转换)
    git流水线(Pipeline)导致分支(Branch)无法合并的解决方法
    【面试:并发篇27:多线程:犹豫模式】
    【计算机网络】TCP协议
  • 原文地址:https://blog.csdn.net/2301_78276982/article/details/133825643