前景:
做web自动化跑脚本时,常常会因为元素未加载出来而使脚本报错。脚本本身没有错误,只是因为元素未加载出来而无法定位到,这不是我们想看到的,因此我们需要在脚本的动作中加入等待时间
分类:
1.线程等待 sleep
俗称傻等, 会强制等待设置的时间后才会执行之后的命令 (不建议使用)
使用方法:
//默认单位毫秒 3000 = 3s
Thread.sleep(3000)
2.隐式等待
特别注意:隐式是设置的全局等待,设置了等待时间,对页面中所有的元素均有效果
因此,如果元素不是马上就能定位成功就会在固定等待时长内不停去搜索元素,在设置时间内发现元素则执行后面操作,如果超出了设置的时间还没发现元素则抛出异常。
所以,隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
这样做的弊端就是会降低测试性能(因为需要不停的去寻找,直至找到为止),并且如果设置时间是5s,在第6s找到了元素,也会报错,因为隐式等待的最大时间是设置的时间。 不推荐使用
使用方法:
//设置driver路径
System.setProperty("webdriver.chrome.driver", "E:\\chromedriver.exe");
driver=new ChromeDriver();
//隐试等待 10秒 全局生效 针对页面中的所有元素
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
3.显式等待
针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。(针对元素,不影响性能,推荐使用)
使用方法:
//显示等待 webDriver 传入参数 driver-驱动 和timeout 最长等待时间 默认为s
// 实例化webdriverWait对象
WebDriverWait webDriverWait = new WebDriverWait(BrowserUtils.driver,6);
//调用until 意思为 直到xxxx 传入一个布尔值
// webDriverWait.until(isTrue);
//eg: 直到元素能够被点击
webDriverWait.until(ExpectedConditions.elementToBeClickable(by));
进阶:
封装两个通用的方法, 分别功能为
1.直到元素可以被点击
/**
* 等待元素可以被点击
* @param by 元素定位表达式
* */
public WebElement waitElementClickable(By by) {
//显示等待 webDriver 传入参数 driver-驱动 和timeout 最长等待时间 默认为s
WebDriverWait webDriverWait = new WebDriverWait(BrowserUtils.driver,6);
//elementToBeClickable 元素可以被点击
WebElement webElement =
webDriverWait.until(ExpectedConditions.elementToBeClickable(by));
//元素可以被点击,返回这个元素, 进行点击操作
return webElement;
}
2.直到元素可见
public WebElement waitElementVisible(By by) {
//显示等待 webDriver 传入参数 driver-驱动 和timeout 最长等待时间 默认为s
WebDriverWait webDriverWait = new WebDriverWait(BrowserUtils.driver,6);
//visibilityOfElementLocated 元素可见
WebElement webElement = webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(by));
return webElement;
}
总结
综上,在web自动化中更建议使用显示等待,其具有更强的灵活性,方便自由封装配置。