zoukankan      html  css  js  c++  java
  • 隐式等待-----Selenium快速入门(九)

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

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

      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会搜索整个页面,直到至少一个元素找到或者超过指定的时间。

      应明智的设置等待时间,因为设置不当,会对测试运行时造成不好的影响。特别是在使用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);
            }

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

      

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

      

          //得到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.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            
            //故意让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);
            }
                    

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

      

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

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

      

  • 相关阅读:
    设计数据密集型应用(中英双语)
    缓存设计中的热点问题讨论
    Python Twisted
    Python-memcached的使用用法
    四款免费好用的Bootstrap ui编辑器
    8个强大的基于Bootstrap的CSS框架
    盘点国内网站常用的一些 CDN 公共库加速服务
    分布式缓存系统 Memcached 快速入门
    函数缓存 (Function caching)
    Golang新开发者要注意的陷阱和常见错误
  • 原文地址:https://www.cnblogs.com/devtester/p/8624482.html
Copyright © 2011-2022 走看看