Selenium WebDriver隐式等待影响整个自动化测试时
Web UI自动化时,很多地方需要判断当前页面中元素是否存在,如果存在就返回true,不存在就返回false.
public boolean isElementExist(String xpath){
int i = driver.findElements(By.xpath(xpath)).size();
return i==0?false:true;
}
当测试用例比较多时,上述方法被频繁调用,当当前页面中不存在要查找的元素时,Webdriver会默认等待20s,频繁出现元素找不到的情况,自动化执行时长就会不断不拉长,本来可以5个小时执行完的用例,结果需要20多小时,如果网速不快时,甚至需要更长的时间。这并不是UI自动化想要的结果。那么如何解决这个问题呢?
上述提到Webdriver找不到元素时,会默认等待20s,这里的20s在哪里设置的呢?
熟悉 Webdriver源码的都知道,在启动浏览器之前,需要加载对应浏览器的driver。
public class LoadChrome {
public static void main(String[] args) {
// 设置谷歌浏览器引擎位置
System.setProperty("webdriver.chrome.driver", "./Tools/chromedriver.exe");
// 初始化一个谷歌浏览器驱动
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
// 使用get方法打开一个网站
driver.get("https://www.baidu.com");
// 获取当前网页的title
System.out.println("当前网页的title:" + driver.getTitle());
System.out.println(driver.getCurrentUrl());
// 关闭浏览器
driver.quit();
}
}
其中 driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 设置了全局的等待时间,即:所有WebDriver执行所有命令的超时时间都为20s。所以当上面isElementExist方法找不到元素时,就会继续等待20s确定后才抛出异常。这样就大大拉长了整个自动化测试执行的时间。这个设置是全局的,为隐式等待。
隐式等待比强制等待智能,因为在整个自动化测试的脚本中看不到隐式等待的语句。但它会在每个页面加载的时候自动等待;隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个WebDriver的实例的生命周期都有效,后续无需重复声明。如果不设置全局元素超时时间,默认超时时间为0 。
隐式等待使用implicitlyWait方法,来等待页面加载完成,implicitlyWait(10),超时时间10s,10秒内一旦加载完成,就执行下一条语句;如果10秒内页面都没有加载完,就超时抛出异常。
那么,当隐式等待设置为20s,自动化测试中想要快速判断页面中是否存在某个元素,又要整个自动化测试执行时间正常时,该如何处理呢?
这里只需要在isElementExist方法中重新设置一下隐式等待的超时时间,待获取页面中是否存在要判断的元素后,再恢复隐式等待的超时时间设置即可。
public boolean isElementExist(String xpath){
driver.manage().timeouts().implicitlyWait(2,TimeUnit.SECONDS);
int i = driver.findElements(By.xpath(xpath)).size();
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
return i==0?false:true;
}