API中对于该类的介绍:Canned ExpectedConditions which are generally useful within webdriver tests。很笼统,大概意思就是在webdriver的测试中会有用,那到底有什么用呢,下面我们就来一探究竟。

该类没有构造函数,所有的方法都是静态的,所以我们可以直接用类名调用,我只介绍里面几个方法,其它方法的用法都类似,具体查api

  • 1.alertIsPresent()判断alert弹框出现了没,返回值是ExpectedCondition<Alert>,我们可以这样用
  •     public void testalertIsPresent() {
    
            dr.findElement(By.id("alert")).findElement(By.className("alert")).click();
    ExpectedCondition<Alert> e = ExpectedConditions.alertIsPresent();
    Alert alert = e.apply(dr);
    alert.accept();
    }

    也可以这样用

        public void testalertIsPresentW() {
    WebDriverWait wait = new WebDriverWait(dr,10);
    dr.findElement(By.id("alert")).findElement(By.className("alert")).click();
    ExpectedCondition<Alert> e = ExpectedConditions.alertIsPresent();
    Alert alert = wait.until(e);
    alert.accept();
    }

    apply用了com.google.common.base.Function的方法,而until用了FluentWait的方法。那么这两者有和区别呢,通过下面这个例子介绍,

  • 2. textToBePresentInElementLocated():文本是否出现在所定位的元素中
  •     public void testtextToBePresentInElementLocated() {
    WebDriverWait wait = new WebDriverWait(dr,10);
    dr.findElement(By.className("wait")).click();
    ExpectedCondition<Boolean> e1 = ExpectedConditions.textToBePresentInElementLocated(By.className("red"),"wait for display");
    System.out.println(e1.apply(dr));//false
    //System.out.println(wait.until(e1)); //报true }

    apply不会去等待所找元素是否存在,直接false报错no such elment。而until会在等待10秒,如果出现则返回true,否则超时。

    • 3.visibilityOfElementLocated(),该方法是判断定位的元素是否存在,使用的方法时(),apply也会去等待

      public void testvisibilityOfElementLocated() {
      WebDriverWait wait = new WebDriverWait(dr,10);
      dr.findElement(By.className("wait")).click();
      ExpectedCondition<WebElement> e1 = ExpectedConditions.visibilityOfElementLocated(By.className("red")); System.out.println(wait.until(e1).getText()); //wait for display
      System.out.println(e1.apply(dr).getText()); //wait for display }
    • 4.visibilityOf(),判断元素是否可见

          public void testvisibilityOf() {
      WebDriverWait wait = new WebDriverWait(dr,10);
      ExpectedCondition<WebElement> e1 = ExpectedConditions.visibilityOf(dr.findElement(By.className("wait"))); System.out.println(e1.apply(dr).getAttribute("value")); //wait
      //System.out.println(wait.until(e1).getAttribute("value"));//wait
      }

5.visibilityOfElementLocated(),定位的元素是否可见

    public void testvisibilityOfElementLocated() {
WebDriverWait wait = new WebDriverWait(dr,10);
dr.findElement(By.className("wait")).click();
ExpectedCondition<WebElement> e1 = ExpectedConditions.visibilityOfElementLocated(By.className("red")); System.out.println(wait.until(e1).getText()); //wait for display
System.out.println(e1.apply(dr).getText()); //wait for display }

以上列举了TestExpectedConditions的用法,鉴于apply会存在失败的情况,建议使用until。

PS:小插曲

下面的例子是api中关于FluentWait的用法

Sample usage:

   // Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait&lt;WebDriver&gt; wait = new FluentWait&lt;WebDriver&gt;(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class); WebElement foo = wait.until(new Function&lt;WebDriver, WebElement&gt;() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});

详细用法:

    @Test(enabled=false)
public void testuntilWebElement() {
WebDriverWait wait = new WebDriverWait(dr,10);
WebElement we = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver arg0) {
// TODO Auto-generated method stub
return arg0.findElement(By.id("user"));
}}) ;
we.sendKeys("test");
} @Test(enabled=false)
public void testuntilBoolean() {
WebDriverWait wait = new WebDriverWait(dr,10);
boolean we = wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver arg0) {
// TODO Auto-generated method stub
return arg0.findElement(By.id("user"));
}}).isDisplayed();
System.out.println(we);
}

两者用法目的差不多,可以根据具体情况选择使用哪种方式。

文中所用到的html例子:

http://pan.baidu.com/s/1i3jjo3b

selenium之ExpectedConditions类的更多相关文章

  1. 《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)

    1.简介 前面宏哥介绍了几种关于时间等待的方法,也提到了,在实际自动化测试脚本开发过程,百分之90的报错是和元素因为时间不同步而发生报错.本文介绍如何新建一个自定义的类库来解决这个元素同步问题.这样, ...

  2. Selenium Webdriver——Table类封装

    WebTable.java import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebEl ...

  3. selenium - webdriver - Keys类(键盘操作)

    Keys()类提供了键盘上几乎所有按键的方法,这个类可用来模拟键盘上的按键,包括各种组合键,如 Ctrl+A, Ctrl+X,Ctrl+C, Ctrl+V 等等 from selenium impor ...

  4. selenium - webdriver - ActionChains类(鼠标操作)

    ActionChains 类提供了鼠标操作的常用方法: perform(): 执行所有 ActionChains 中存储的行为: context_click(): 右击: double_click() ...

  5. Python+Selenium框架 ---一个类文件多个测试方法情况下测试固件的写法

    我们测试中,肯定需要,打开一个页面,然后测试这个页面的多个用例,才关闭这个页面,去测试其他页面,在unittest是有相关测试固件方法去支持这种行为.请看下面 # coding=utf-8 impor ...

  6. Selenium之ActionChains类、Keys类

    ActionChains类(鼠标操作)常用于模拟鼠标的行为,比如单击.双击.拖拽等行为. 一些常用的模拟鼠标的操作方法有: click(on_element=None)     --- 鼠标单击 do ...

  7. Selenium常见报错问题(1)- 先来认识下selenium常见异常类

    如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...

  8. selenium模块及类组织关系

    问题:webdriver子模块中为什么可以直接使用类Chrome.ChromeOptions.Firefox.FirefoxProfile... 在webdriver的__init__.py文件中已经 ...

  9. Selenium 的基础框架类

    个人写的一个selenium的base类,应该所有使用selenium的同事都会使用到: package com.hx.baserunner; import static java.io.File.s ...

随机推荐

  1. 百度FIS入门

    1.fis作为nodejs的模块来管理的,所以首先得安装nodejs,看我前面的安装nodejs的文章. 2.官方的案例下载包https://github.com/hefangshi/fis-quic ...

  2. Json Utils

    import java.util.List;import java.util.Map; import net.sf.json.JSONArray;import net.sf.json.JSONObje ...

  3. python flask应用部署

    失败版本:flask+uwsgi ini配置文件 [uwsgi] callable = app ;//程序内启用的application变量名 home = /home/jcuan/code/pyth ...

  4. 2016 一中培训 day 5 ksum

    又是一天的爆零!!!!! 原本第一题 很容易做 竟然优化过度 丢了答案 1693: ksum Time Limit 1000 ms Memory Limit 524288 KBytes Judge S ...

  5. 【OpenCV & CUDA】OpenCV和Cuda结合编程

    一.利用OpenCV中提供的GPU模块 目前,OpenCV中已提供了许多GPU函数,直接使用OpenCV提供的GPU模块,可以完成大部分图像处理的加速操作. 基本使用方法,请参考:http://www ...

  6. 六个创建模式之工厂方法模式(Factory Method Pattern)

    问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...

  7. Q:关于Outlook for CRM 中预览记录窗体的设置

    问题: 如何在Outlook for CRM中,将实体记录的预览窗口的信息做调整? 解决方案: 在Outlook里,在打开实体后选择View=>Customize Reading Pane,这里 ...

  8. oracle断电重启之ORA-01033和ORA-01172

    参考文献: ORA-01033:解决方法 数据库掉电后 ORA-01172 磁盘坏块解决方法 --尝试连接数据库prjdb C:\Documents and Settings\Administrato ...

  9. Redis介绍及常用命令

    一 Redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发 ...

  10. 【读书笔记】iOS-NSNumber

    NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,如int,float或struct.但是你可以用对象来封装基本数值.例如,将int型数据封装到一个对象中,然后就 ...