显式等待与隐式等待的区别是什么

问题

显式等待与隐式等待的区别

三种等待方式分别是什么,有什么区别

考察点

面试官想了解:

  • 显式等待与隐式等待的区别

  • 三种等待方式分别是什么,有什么区别

技术点

涉及的技术点:

  • 显式等待

  • 隐式等待

  • 强制等待

回答

自动化测试中,Selenium框架为了页面等待提供了两种等待方式:隐式等待、显示等待。

隐式等待

在创建driver时声明并且只声明一次,声明后在整个WebDriver周期都生效,相当于一个全局变量。隐式等待相当于告诉driver去等待一定时间后再去执行代码操作,即当页面加载完成后,才会执行下一步。

优点

只需声明一次,不需要在每个操作步骤声明。

缺点

设置隐式等待后,对应的影响的不是某一个元素而是整个页面,只有整个页面加载完成后才会执行下一步。

页面加载完成后,如果要操作的是某个元素,则需要等当前元素的所有属性加载完成。即不只是UI加载完成,还需要对应的元素的js文件、图片等加载完成,此时会增加不必要的加载时间。

代码

Java代码声明如下:


driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(等待时间秒数));

Python代码声明如下:


driver.implicitly_wait(等待时间)

显式等待

需要定位某个元素时,但是元素有可能还未加载出来,这时就需要针对具体的元素或者页面进行显式等待条件的判断。

优点

针对指定元素或页面生效,不是整个WebDriver周期生效。所以,可以根据对应定位的元素来设置显式等待的判断条件,会节省加载其它无关文件的时间,即不需要等待页面加载完成。

缺点

必须在需要的操作前声明对应的显示等待及其判断条件,如果每个步骤都需要则需要在每个步骤前都声明。

代码

Java代码声明如下:


WebDriverWait wait = new WebDriverWait(androidDriver,

Duration.ofSeconds(时间), //总共查找等待条件的时间

Duration.ofSeconds(时间));//每隔多少秒去查找一次显示等待的条件

wait.util(条件函数);

Python代码声明如下:


Welement = WebDriverWait(driver, 最长等待时间, 执行间隔).until(条件函数)

显式等待和隐式等待的区别

隐式等待可以看作全局变量,显式等待可以看作为局部变量。

强制等待

直接是线程等待,只有等待完成后才能运行代码。

总结

类型 使用方式 原理 适用场景
直接等待 Python:time.sleep(等待时间)
Java:Thread.sleep(等待时间);
强制线程等待 调试代码,临时性添加
隐式等待 Python:driver.implicitly_wait(等待时间)
Java:driver.manage().timeouts().implicitlyWait(等待时间);
在时间范围内,轮询查找元素 解决找不到元素问题,无法解决交互问题,也无法自定义等待条件
显式等待 Python:WebDriverWait(driver, 最长等待时间, 执行间隔).until(条件函数)
Java:WebElement wait = new WebDriverWait(driver,最长等待时间).until(条件函数);
设定特定的等待条件,轮询操作 解决特定条件下的等待问题,比如点击
关闭