博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
显式等待-----Selenium快速入门(十)
阅读量:6463 次
发布时间:2019-06-23

本文共 4641 字,大约阅读时间需要 15 分钟。

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

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

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

  1.( driver,  clock,  sleeper, long timeOutInSeconds, long sleepTimeOut) 

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

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

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

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

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

  2.( driver, long timeOutInSeconds)

       3.( 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
() { @Override public WebElement apply(WebDriver arg0) { // TODO Auto-generated method stub return arg0.findElement(By.id("eleID")); } });

  until的参数太复杂,搞不懂?没关系,官方早已定义了常见的条件。这些条件都在ExpectedConditions这个类中。里面的方法很多,看名字基本就能猜到用途,官方的文档为:

  例如:

//得到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"));

  更多的预置条件请查看:

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

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

 
  

  然后,我们的代码要实现的功能是,等待5秒,直到inputID这个文本框显示,我们就在文本框内输入“hello,selenium",html中有个按钮,就是用来控制文本框的显示隐藏状态。要实现这个功能,我们需要用到( 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("定位元素超时!");        }

  执行效果如下:

  

 

转载于:https://www.cnblogs.com/devtester/p/8648490.html

你可能感兴趣的文章
php i=i 怎么实现,ThinkPHP的I方法使用详解
查看>>
java 对输入的字符串处理方法,JavaScript中对字符串操作方法总结--Java免费学习网...
查看>>
java 猫 游戏,crazycat 围住神经猫-小游戏-Java源码 联合开发网 - pudn.com
查看>>
php等差数列,【教案】高中数学-《等差数列》详案展示
查看>>
php脚手架,thinkphp集成前端脚手架Vue-cli的教程图解
查看>>
php多维数组算法,PHP多维数组算法?
查看>>
flash as3与后台php交互用户注册例子,Flash AS3与后台通讯 PHP版
查看>>
php对大小写敏感,PHP大小写敏感规则
查看>>
java pkcs10,话说 类加载过程 第一篇
查看>>
matlab中如何使用help,MATLAB中如何使用help?怎样看matlab的help
查看>>
matlab的函数的代码,10 Matlab 函数与代码风格
查看>>
php日期语言,Php多语言日期:howto?
查看>>
php前台ajax商品遍历,jquery ajax加载数据前台渲染方式 不用for遍历的方法
查看>>
php openapi设计,OpenApi开放平台架构实践
查看>>
java 基本程序,基础 JAVA程序
查看>>
matlab中求解不等式的解,大神们,求个解多元一次不等式的代码,要所有整数解...
查看>>
php的算法是什么,算法是什么?
查看>>
discuz login.php,Discuz!登录,注册,退出接口.
查看>>
matlab 荷兰颜色,insar_matlab 荷兰Delft大学开发的insar(干涉合成孔径雷达)图像处理部分源代码 - 下载 - 搜珍网...
查看>>
Unix php平滑安装扩展,Linux下安装php的扩展scws
查看>>