隐式等待-----Selenium快速入门(九)

有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败。在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现过类似的问题,当一次访问的时候,发现页面不一定能成功加载iframe,需要再次刷新,iframe才可以成功加载。等待,就是要解决这类的问题,实际上,我们前面已经在不知不觉中使用了,就是使用java自身的Thread.Sleep()进行暂停等待。而Selenium对于元素等待则提供了隐式和显式两种等待方式。

查找元素隐式等待:就是调用driver.manage().timeouts().implicitlyWait(longtime, java.util.concurrent.TimeUnitunit)进行等待。

time:等待的时间长度

unit:等待的时间单位,例如秒

该方法的官方文档:http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#implicitlyWait-long-java.util.concurrent.TimeUnit-

官方说明翻译:当一个元素不能马上呈现时,指定driver应该等待的时间。若是单个元素的查找,driver会搜索整个页面,直到元素找到或者超过指定的时间。当超过指定时间仍未找到,则会抛出NoSuchElementException异常。若是查找多个元素,driver会搜索整个页面,直到至少一个元素找到或者超过指定的时间。<br />

应明智的设置等待时间,因为设置不当,会对测试运行时造成不好的影响。特别是在使用XPath这类比较慢的定位策略时,尤其需要合理使用。

简单说:如果查找单个元素,找到则马上停止,如果超过指定时间都没找到就抛出找不到的异常。如果查找多个元素,则会在指定时间内尽量查找,但不保证能找到所有。之所以要明智设置等待时间,因为这个方法对于driver来说是全局性的,每次这个driver去查找元素,都会遵循上面的方法。

下面的代码,将会证实隐式等待确实是按上面的方法执行的。先访问安科网主页,查找“找找看”这个标签,可以看到是即时返回,然后故意给一个不存在的元素,让driver查找,可以看到它抛出异常的时间是之前设定的超时时间。

    //得到WebDriver
        WebDriver driver=DriverHelper.CreateChromeDriver();
        //设置隐式查找元素的等待时间是5秒
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("http://www.cnblogs.com");
        
        //计算查找安科网首页“找找看”链接元素的时间
        Date startTime1=new Date();
        WebElement element = driver.findElement(By.linkText("找找看"));
        Date endTime1=new Date();
        long diff1=endTime1.getTime()-startTime1.getTime();
        System.out.println("找到连接元素‘找找看’所用的时间是:" + diff1+"毫秒");
        
        //故意让driver去查找一个不存在的元素aaa,看看它抛出异常的时间是否跟我们设置的5秒一样
        Date startTime2=new Date();
        try
        {
            driver.findElement(By.id("aaa"));
        }
        catch (Exception e) {
            Date endTime2=new Date();
            long diff2=endTime2.getTime()-startTime2.getTime();
            System.out.println("抛出异常的时间间隔:"+diff2);
        }

最后的运行结果为(单位是毫秒):

隐式等待-----Selenium快速入门(九)

如果多次设置等待时间那该使用哪个时间呢,我们在两个查找之间重新设定等待时间,代码如下

  //得到WebDriver
        WebDriver driver=DriverHelper.CreateChromeDriver();
        //设置隐式查找元素的等待时间是5秒
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get("http://www.cnblogs.com");
        
        //计算查找安科网首页“找找看”链接元素的时间
        Date startTime1=new Date();
        WebElement element = driver.findElement(By.linkText("找找看"));
        Date endTime1=new Date();
        long diff1=endTime1.getTime()-startTime1.getTime();
        System.out.println("找到连接元素‘找找看’所用的时间是:" + diff1+"毫秒");
        
        //多次设置等待时间
       <strong> driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        </strong>//故意让driver去查找一个不存在的元素aaa,看看它抛出异常的时间是多少
        Date startTime2=new Date();
        try
        {
            driver.findElement(By.id("aaa"));
        }
        catch (Exception e) {
            Date endTime2=new Date();
            long diff2=endTime2.getTime()-startTime2.getTime();
            System.out.println("抛出异常的时间间隔:"+diff2);
        }

执行效果为(单位是毫秒):

隐式等待-----Selenium快速入门(九)

可见多次设置等待时间,是以最后一次设置为准,并非以最小等待时间或最大等待时间为准。

另外,这个全局设置是当前实例driver独有的,如果你此时新实例化了另一个driver2,那么driver2的隐式等待与driver无关,大家可以按上面的代码自己修改一下看看最后的效果。

相关推荐