有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败。在本系列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无关,大家可以按上面的代码自己修改一下看看最后的效果。

  

隐式等待-----Selenium快速入门(九)的更多相关文章

  1. 显式等待-----Selenium快速入门(十)

    上一篇说了元素定位过程中的隐式等待,今天我们来探讨一下显示等待.显式等待,其实就是在使用WebDriverWait这个对象,进行等待.显式等待对比隐式等待,多了一些人性化的设置,可以说是更细化的隐式等 ...

  2. Selenium+Java显示等待和隐式等待

    描述:用来操作界面上的等待时间,显示等待是等待某一条件满足,条件满足后进行后面的操作:隐式等待是给出一个等待时间,在时间到达之前若满足条件,则立即执行后续操作. public class TestSe ...

  3. [bug] 验证selenium的显式和隐式等待而发现的一个低级错误

    隐式等待:如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步.按照这说法举了个例子为啥不会按照预期执行了,难不成是这个定义有问题(~~~~~直接否定不是定义的问题,相信它 ...

  4. Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等

    Selenium  如何定位动态元素: 测试的时候会遇到元素每次变动的情况,例如: <div id="btn-attention_2030295">...</di ...

  5. selenium测试(Java)-- 隐式等待(十)

    隐式等待相当于设置全局的等待,在定位元素时,对所有元素设置超时时间. 隐式等待使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,如果Elem ...

  6. selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python

    我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中 ...

  7. 重写selenium 的 click()操作,使其变成隐式等待

    selenium 页面常会因为页面加载慢而出现element 不能被点击到的情况,比如加载过程中出现遮罩,导致element 可见不可点.以下方法重写click(),用隐式等待解决这个问题. 基本思路 ...

  8. selenium 找不到元素 (显式等待 和隐式等待的区别)

    selenium自动化页面元素不存在异常发生的原因有一下几点: (1)页面加载时间过慢,需要查找的元素程序已经完成但是页面还未加载成功.此时可以加载页面等待时间. (2)查到的元素没有在当前的ifra ...

  9. selenium的显示等待和隐式等待区别

    1.selenium的显示等待 原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.(简而言之:就 ...

随机推荐

  1. luoguP1064 金明的预算方案 (有依赖的背包问题)

    题目链接:https://www.luogu.org/problemnew/show/P1064 这是一个有依赖的背包问题,属于01背包的变式.这题还好,每个主件最多有2个附件,那么在对主件进行背包的 ...

  2. poj1088-滑雪 【dfs 记忆化搜索】

    http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79806 ...

  3. Web服务器和应用服务器简介

    通俗的讲,Web服务器传送页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods).确切一点,你可以说:Web服务器专门处理HTTP请求(reques ...

  4. linux 下 php 安装 Gearman

    Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.   一个Gearman请求的处理过程涉及三个角色: Clien ...

  5. php5.3 php-fpm 开启 关闭 重启

    自php5.3开始,php源码中包含了php-fpm,不需要单独通过补丁的方式安装php-fpm,在源码安装的时候直接 configure 中增加参数 –enable-fpm 即可.   所以启动.关 ...

  6. C++的MFC 与 HTML 双向通讯

    C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 最近项目中用html 来做界面,也就折腾了一下在wxwidget中嵌入浏览器的若干细节工作,mfc也基本是类似的,由于wxwidget中已 ...

  7. JavaScript的replace方法与正则表达式结合应用讲解

    大家好!!今晚在华软G43*宿舍没什么事做,把javascript中replace方法讲解一下,如果讲得不对或不合理是情理之中的事,因为我不是老鸟,也不是菜鸟,我也不知道我当底是什么鸟??呵~~ re ...

  8. Python鸭子类型思想

    动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it ...

  9. 二进制搭建kubernetes多master集群【二、配置flannel网络】

    上一篇我们已经搭建etcd高可用集群,参考:二进制搭建kubernetes多master集群[一.使用TLS证书搭建etcd集群] 此文将搭建flannel网络,目的使跨主机的docker能够互相通信 ...

  10. 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...