HJ10.8 三种等待方式

Wait 等待

  • 强制等待:sleep 不推荐
  • 全局隐式等待
    • 在服务端等待
    • driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  • 显式等待
    • 在客户端等待
    • new WebDriverWait(driver).until(ExpectedConditions.visibilityOfElementLocated(By.xpath(""))).action;
  • 显式等待
    • 显式等待与隐式等待相对,显式等待必须在每个需要等待的元素前面进行声明。
    • 是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在。
    • 如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,
    • 如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
  • 显示等待用到的两个类
    • WebDriverWait 和 ExpectedConditions 两个类
  • 显式等待可以等待动态加载 ajax 元素,显式等待需要使用 ExpectedConditions 来检查条件
  • 一般页面上元素的呈现
    • title 出现 首先出现title
    • dom 树出现 presence,还不完整
    • css 出现 (可见 visibility)
    • js 出现,js 特效执行(可点击clickable)
  • html 文档是自上而下加载的
  • js 文件加载会阻塞 html 内容的加载,有些 js 异步加载的方式来完成 js 的加载
  • 样式表下载完成之后会跟之前的样式表一起进行解析,会对之前的元素重新渲染

WebDriverWait 用法

  • wait = new WebDriverWait(driver,10,1000);
  • driver:浏览器驱动
  • timeOutInSeconds:最长超时时间,默认以秒为单位
  • sleepInMillis:检测的间隔步长,默认为0.5s
  • WebDriverWait 的 until()
    • wait.until(ExpectedConditions.visibilityOf(home_search)).click();

ExpectedConditions 类

  • presenceOfElementLocated 判断元素是否被加到 DOM 里,并不代表该元素一定见
    • 用法:wait.until(ExpectedConditions.presenceOfElementLocated(By.id("home_search")));
  • visibilityOfElementLocated 判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
    • 用法:wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("home_search")))

总结三种等待方式

  • 隐式等待,尽量默认都加上,时间限定在3-6s,不要太长,为了所有的 find_element 方法都有一个很好的缓冲
  • 显式等待,用来处理隐式等待无法解决的一些问题,比如:文件上传(可以设置长一点),文件上传需要设置 20s 以上,但是如果设置隐式等待,他会在每个 find 方法都等这么长时间,一旦没有找到元素,就会等 20s 以上才抛出异常,影响 case 的执行效率,这时候就需要用显式等待,显式等待可以设置的长一点
  • 强制等待:一般不推荐,前两种基本能解决绝大部分问题,如果某个控件没有任何特征,只能强制等待,这种情况比较少
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容