问题
显式等待与隐式等待的区别
三种等待方式分别是什么,有什么区别
考察点
面试官想了解:
-
显式等待与隐式等待的区别
-
三种等待方式分别是什么,有什么区别
技术点
涉及的技术点:
-
显式等待
-
隐式等待
-
强制等待
回答
自动化测试中,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(条件函数);
|
设定特定的等待条件,轮询操作 | 解决特定条件下的等待问题,比如点击 |