软件测试学习之路

Selenium WebDriver隐式等待影响整个自动化测试时

2019-05-31  本文已影响0人  乘风破浪的姐姐

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;
    }
上一篇下一篇

猜你喜欢

热点阅读