1、硬性等待
Thread.sleep(long millis); 硬性等待(强行等待,等待时间过长)sleep(毫秒)
-
优点:使用简单
-
缺点:容易造成时间浪费
-
使用场景:有的浏览器只能用硬性等待,或者有点场景显示/隐式等待都不行
2、隐式等待
在设置的超时时间范围内不断查找元素,直到 找到元素(元素存在)或者超时为止
全局的,就是设置了隐式等待后,每一条查找语句都要去隐式等待
如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
-
特点:全局,去当前网页的源码html中找,找到了该元素就不等待,一般等待一些常见的元素
-
设置方式:driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);
long time:等待时长数字, TimeUnit unit:等待时长单位
//设置等待时间为5秒
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
-
优点:相对灵活
-
缺点:设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待
⚠️只能等待元素存在,不能适用条件更复杂的情况,如:元素可点击、元素可见才能操作,但是隐式等待是查元素是否在html源码存在,存在不一定可点击
思考场景:
比如一个弹窗的关闭按钮❌,页面缩放的时候看不到❌也不能点击,但是这时候html源码中是存在的,如果用隐式等待 能找到,但是实际执行点击操作却不行;
因为从html找到该元素,并不一定能点击,能可见,这时候需要 显式等待⬇️
3、显式等待
显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码(如元素存在、元素可点击、元素可见等)
-
特点:针对每一个元素可以设置不同的等待时间和等待条件,如果超时就报错
-
使用方式:
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement element = wait.until(ExpectCondition.方法(元素路径));
WebDriverWait(driver,5)------表示:等待5秒,还有第三个参数,不传的话默认500毫秒,即:每0.5秒轮训查找一次
-
优点:
每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,不存在则继续等待,直到找到或超时。
该方式不是全局设置,因此特定需要等待的元素可以这样处理,推荐优先使用这一种方法。
方法 | 等待条件 |
---|---|
presenceOfElementLocated❗️和隐式等待效果一样,是否在源码中存在 | 页面元素在页面中存在 |
visibilityOfElementLocated | 页面元素在页面存在并且可见 |
elementToBeClickable | 页面元素是否在页面上可被单击 |
urlContains("url")) | 等待url是否包含,返回boolean |
举例:
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable
(By.xpath("//span[@class='layui-layer-setwin']//a")));
element.click();
⚠️ 元素是否可见和元素是否可点击是不一样的
不可见一定不可点击,可见不一定可点击(比如有可能被弹窗盖住了...),可点击一定可见
存在不一定可见,可见一定存在
android的toast,就是存在但是不可见:presenceOfElementLocated定位到,visibilityOfElementLocated定位不到