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

  WebDriverWait 类继承自泛型类 FluentWait<T> ,而这个泛型类,又是泛型接口Wait<T> 的实现。Wait<T>这个泛型接口只有一个方法,就是until,这也是我们需要重点掌握的方法,而FluentWait<T>实现了until方法,而且还扩充了一些设置,例如,设置等待时间,每隔多少时间执行一次,执行过程中哪些异常可以忽略,以及超时的时候显示的信息。同样,WebDriverWait既然继承了FluentWait<T>,也会拥有一样的方法。

  首先,我们如何得到WebDriverWait的实例呢,他的构造函数有3个。

  1.WebDriverWait(WebDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut)

     driver:这个不用说,大家都应该知道。

     clock:Clock是一个接口,clock参数是用来定义超时,一般使用默认即可。关于更详细的Clock接口,可以点击这里

sleeper:Sleeper也是一个接口,sleeper这个参数是,让当前线程进入睡眠的一个对象

     timeOutInSeconds:超时的时间,单位是秒

     sleepTimeOut:线程睡眠的时间,默认是500毫秒,也就是默认500毫秒执行一次

  2.WebDriverWait(WebDriver driver, long timeOutInSeconds)

3.WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)

  有了第一个构造函数的解释,后面两个就很简单了,实际上,后面两个构造函数更常用。

  由于Clcok和Sleeper都是接口,我们可以自己重新实现,也可以用已有的实现,例如,SystemClock就实现了Clock,而Sleeper,他有一个static final的字段SYSTEM_SLEEPER,我们可以使用它来作为参数。下面是Sleeper接口的源码

public interface Sleeper {

  public static final Sleeper SYSTEM_SLEEPER = new Sleeper() {
public void sleep(Duration duration) throws InterruptedException {
Thread.sleep(duration.in(TimeUnit.MILLISECONDS));
}
};
/**
* Sleeps for the specified duration of time.
*
* @param duration How long to sleep.
* @throws InterruptedException If the thread is interrupted while sleeping.
*/
void sleep(Duration duration) throws InterruptedException;
}

  所以,要使用构造函数一得到wait对象,可以这样

WebDriverWait wait=new WebDriverWait(driver, new SystemClock(), Sleeper.SYSTEM_SLEEPER, 10, 1000);

  实际上,当我们使用后面两个构造函数的时候,其实也是在默认使用这两个参数,我们看看WebDriverWait构造函数的源码

 /**
* Wait will ignore instances of NotFoundException that are encountered (thrown) by default in
* the 'until' condition, and immediately propagate all others. You can add more to the ignore
* list by calling ignoring(exceptions to add).
*
* @param driver The WebDriver instance to pass to the expected conditions
* @param timeOutInSeconds The timeout in seconds when an expectation is called
* @param sleepInMillis The duration in milliseconds to sleep between polls.
* @see WebDriverWait#ignoring(java.lang.Class)
*/
public WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis) {
this(driver, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, sleepInMillis);
}

  懂得第一个构造函数的使用,后面两个就不啰嗦了,后面两个实际是在使用默认的参数调用第一个构造函数。

  现在我们得到了WebDriverWait对象,怎么实现等待呢。刚说了,until是当中最重要的一个方法,我们看看WebDriverWait中这个until方法的定义。

  public <V> V until(java.util.function.Function<? super WebDriver,V> isTrue) ,

  until方法中的参数是一个Function,其中? super WebDriver是参数,表示包括WebDriver在内的所有WebDriver的父类,V是返回值的类型。

  例如:

     //得到WebDriver
WebDriver driver=DriverHelper.CreateChromeDriver(); //定义超时10秒,默认每500毫秒轮询一次
WebDriverWait wait=new WebDriverWait(driver,10);
//重新定义轮询时间,每隔1秒轮询一次
wait.pollingEvery(1000, TimeUnit.MILLISECONDS);
//忽略NoSuchElementException异常
wait.ignoring(NoSuchElementException.class); //等待10秒,每隔1秒定位一次,直至超时或返回要找的元素
WebElement ele = wait.until(new Function<WebDriver,WebElement>() {
@Override
public WebElement apply(WebDriver arg0) {
// TODO Auto-generated method stub
return arg0.findElement(By.id("eleID"));
} });

  until的参数太复杂,搞不懂?没关系,官方早已定义了常见的条件。这些条件都在ExpectedConditions这个类中。里面的方法很多,看名字基本就能猜到用途,官方的文档为:http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

  例如:

    //得到WebDriver
WebDriver driver=DriverHelper.CreateChromeDriver(); //定义超时10秒,默认每500毫秒轮询一次
WebDriverWait wait=new WebDriverWait(driver,10); //等待直到标题包含abc
wait.until(ExpectedConditions.titleContains("abc")); //等待直到元素可点击
wait.until(ExpectedConditions.elementToBeClickable(By.id("aaa"))); //等待直到url包含cnblogs.com
wait.until(ExpectedConditions.urlContains("cnblogs.com"));

  更多的预置条件请查看:http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

  下面通过一个例子,来看看具体怎么使用。

  首先,我们在html文件夹新建一个wait.html,html代码如下:

<!DOCTYPE html>
<html>
<head> 
<meta> 
<title></title> 
</head>
<body> <input type="text" id="inputID" style="display:none"/>
<input type="button" value="点击" onclick="document.getElementById('inputID').style.display='';"/> </body>
</html>

  然后,我们的代码要实现的功能是,等待5秒,直到inputID这个文本框显示,我们就在文本框内输入“hello,selenium",html中有个按钮,就是用来控制文本框的显示隐藏状态。要实现这个功能,我们需要用到visibilityOfElementLocated(By located)。

  代码如下:

     //得到WebDriver
WebDriver driver=DriverHelper.CreateChromeDriver();
//跳转到html
driver.get("file:///D:/WorkSpace/SeleniumTest/html/wait.html"); //等待5秒,如果inputID显示,则输入"hello,selenium",否则,输出信息“定位元素超时”
WebDriverWait wait=new WebDriverWait(driver, 5);
try
{
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inputID"))).sendKeys("hello,selenium");
}
catch (org.openqa.selenium.TimeoutException e)
{
System.out.print("定位元素超时!");
}

  执行效果如下:

  

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

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

    有时候,网页未加载完成,或加载失败,但是我们后续的代码就已经开始查找页面上的元素了,这通常将导致查找元素失败.在本系列Selenium窗口切换-----Selenium快速入门(六)中,我们就已经出现 ...

  2. Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  3. selenium测试(Java)-- 显式等待(九)

    转自:https://www.cnblogs.com/moonpool/p/5668571.html 显式等待可以使用selenium预置的判断方法,也可以使用自定义的方法. package com. ...

  4. 【亲测显式等待】Selenium:元素等待的4种方法

    Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用.   2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...

  5. selenium自动化之显式等待和EC(expected_conditions)模块

    很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ...

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

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

  7. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

  8. selenium—隐式等待和显式等待

    一.隐式等待和显式等待的区别 隐式等待:是整个页面的等待.设置一个最长的等待时间,在规定时间内整个页面加载完成,则执行下一步,否则继续等待直到最长等待时间结束. 显式等待:是针对某个元素的等待.在设置 ...

  9. Selenium系列(六) - 强制等待、隐式等待、显式等待

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

随机推荐

  1. centos7装NVIDIA显卡驱动

    一.系统及显卡 系统:centos7.5 64位 显卡:gtx 1060 前几天主要是有一个人脸识别的项目测试,需要用到显卡去测试性能,然后装显卡的过程折腾了一下,特此记录. 二.安装过程 1. 下载 ...

  2. linux 下的 rsync 文件同步

    rsync是linux下的一款快速增量备份工具Remote Sync,是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “rsync ...

  3. phpcms如何给已有的模块添加新功能?

    phpcms如何给已有的模块添加新功能? 方法一:直接在模块里的控制器文件中添加功能. 不建议使用此方法,因为一旦phpcms升级,有可能会覆盖模块中的文件, 导致你添加的功能丢失. 方法二:新建一个 ...

  4. jquery:为动态加载的元素添加点击事件

    jquery:为动态加载的元素添加点击事件 最近在做项目的时候遇到了这样一个问题,给用ajax动态加载出来的内容添加点击事件,但是怎么都触发不了,经过查询试验总结出正确的写法 在jquery1.7之前 ...

  5. Gitlab不小心关闭了sign-in,无法登录web的坑。。。

    手贱一不小心用root在gitlab后台把登录功能给关了,当时我就懵逼了. 解决方法如下: #进入数据库修改配置[root@gitlab-server ~]# gitlab-psql gitlabhq ...

  6. linux下添加用户并赋予root权限

    1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户#passwd tommy   //修改密码Changing pass ...

  7. Windows 7 手动添加受信任证书教程

    步骤如下: 1.点击开始-运行,如下图: 2.弹出"控制台"窗口如下,如下图: 3.点击"文件-添加/删除管理单元",如下图: 4.选择"证书&quo ...

  8. 不要用for in语句对数组进行遍历

    for...in主要用于对数组和对象的属性进行遍历.for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作. 语法:for (variable in object) ...

  9. send发送一次buffer

    发送的字符串后面添加:\r\n 结束标志 否则发送1024或者程序接收默认的字节数 #include <stdio.h> #include <stdlib.h> #includ ...

  10. Java数据结构和算法(一)散列表

    Java数据结构和算法(一)散列表 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 散列表(Hash table) 也叫哈希表 ...