第4章 Selenium2-java WebDriver API (一)

简介: 4.1  从定位元素开始 WebDriver提供了八种元素定位方:   在Java语言中对应的定位方法: ·id                findElement(By.id())        ·name              findElement(By.

4.1  从定位元素开始

WebDriver提供了八种元素定位方:   在Java语言中对应的定位方法:

·id                findElement(By.id())        
·name              findElement(By.name())
·class name            findElement(By.className())
·tag name            findElement(By.tagName())
·link text              findElement(By.linkText())
·partial link text         findElement(By.partialLinkText())
·xpath              findElement(By.xpath())
·css selector             findElement(By.cssSeletor())

 

id定位:name定位,class定位都是通过他们的属性值来的。

link定位:专门用来定位文本链接。eg:<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>  对应的link定位 findElement(By.linkText("新闻"))。

partial link定位:parial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接。eg:<a class="mnav" name="tj_trnews" href="http://news.baidu.com">这是一个很长很长的文本链接</a>  对应的partial link定位   findElement(By.partialLinkText("一个很长的"))   或  findElement(By.partialLinkText("文本链接"))。

xpath定位:最简单的找到元素的位置的方法就是打开FireBug。

 

 CSS定位:<span class="sp">

                    <input id="abc" name="def" class="ghi" type="text" maxlength='100' />

               </span>

     通过class属性定位:findElement(By.cssSelector(".ghi"));

     通过id属性定位:findElement(By.cssSelector("#abc"));

     通过标签名定位:findElement(By.cssSelector("input"));

   通过父子关系定位: findElement(By.cssSelector("span > input"));

     通过属性定位:findElement(By.cssSelector("input[maxlength='100']"));

 

XPath与CSS的类似功能的简单对例如下表所示

    

 

 

package com.cy.selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;

import bsh.commands.dir;


public class Test01 {
    public static void main(String[] args) {       
        System.out.println("start selenium");
        WebDriver driver=new FirefoxDriver();// 用WebDriver new Firefox浏览器的驱动给变量driver,相当于driver拿到了Firefox浏览器的控制权。
        driver.manage().window().maximize();
        driver.get("http://www.awbeci.com/");
        driver.findElement(By.xpath(".//*[@id='navbar-collapse-01']/ul[2]/li[2]/button")).click();
        driver.findElement(By.id("username")).sendKeys("SmileCy");
        driver.findElement(By.id("password")).sendKeys("1314520");
        driver.findElement(By.linkText("登录")).click();
        driver.findElement(By.xpath(".//*[@id='main-container']/div[1]/div[2]/div/div[2]/div/a[3]/span")).click();
        
        // 回车键查询
        driver.findElement(By.cssSelector(".form-control")).sendKeys("软件测试学");
        new Actions(driver).sendKeys(Keys.ENTER).perform();// 按回车键
       
        // 后退
       driver.navigate().back();
       
       // 刷新
       driver.navigate().refresh();

       // 关闭浏览器
        driver.close();
        
    }

}

 

 

4.2  控制浏览器

   4.2.1  控制浏览器窗口大小 

 driver.manage().window().setSize(new Dimension(400, 500));

  4.2.2  控制浏览器后退、前进

     WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮

     // 后退
       driver.navigate().back();
       
       // 刷新
       driver.navigate().refresh();

 

  4.2.3  模拟浏览器刷新

driver.navigate().refresh();

4.3  简单元素操作

·clear()             清除文本。
·sendKeys(*value)     模拟按键输入。
·click()             单击元素。

  4.3.2  WebElement接口常用方法

submit()   submit()方法用于提交表单

getSize()             返回元素的尺寸。

getText()             获取元素的文本。

getAttribute(name)     获得属性值。

isDisplayed()         设置该元素是否用户可见。

4.4  鼠标事件

Actions 类提供了鼠标操作的常用方法:
· contextClick()    右击
· clickAndHold()   鼠标点击并控制
· doubleClick()    双击
· dragAndDrop()   拖动
· release()        释放鼠标

· perform()  执行所有Actions中存储的行为

 

鼠标右击操作。

导入提供鼠标操作的ActionChains 类
Actions(driver)
调用Actions()类,将浏览器驱动driver作为参数传入。
contexClick(xxx)
contextClick()方法用于模拟鼠标右键操作,在调用时需要指定元素定位。
perform() 执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。

 action.contextClick(driver.findElement(By.className("cnisdisd"))).perform();

 

鼠标悬停。clickAndHold();

 action1.clickAndHold(driver.findElement(By.linkText("设置"))).perform();

 

鼠标双击操作。
doubleClick()方法用于模拟鼠标双击操作。

 action1.doubleClick(driver.findElement(By.className(""))).perform();

 

鼠标拖放操作。
drag_and_drop(source, target)在源元素上按下鼠标左键,然后移动到目标元素上释放。
·source:鼠标拖动的源元素。
·target:鼠标释放的目标元素。

      WebElement source=driver.findElement(By.className("element"));
      WebElement target=driver.findElement(By.className("element"));
      action1.dragAndDrop(source, target).perform();

 

释放鼠标
release()方法用于释放鼠标事件。

 action1.release().perform();

 

4.5  键盘事件

使用键盘按键方法前需要先导入keys类。
以下为常用的键盘操作:
sendKeys(Keys.BACK_SPACE)     删除键(BackSpace)
sendKeys(Keys.SPACE)              空格键(Space)
sendKeys(Keys.TAB)                  制表键(Tab)
sendKeys(Keys.ESCAPE)            回退键(Esc)
sendKeys(Keys.ENTER)              回车键(Enter)
sendKeys(Keys.CONTROL,'a')   全选(Ctrl+A)

sendKeys(Keys.CONTROL,'c')   复制(Ctrl+C)
sendKeys(Keys.CONTROL,'x')   剪切(Ctrl+X)
sendKeys(Keys.CONTROL,'v')    粘贴(Ctrl+V)
sendKeys(Keys.F1)                    键盘F1
……
sendKeys(Keys.F12)                 键盘F12

package com.cy.selenium;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;


public class Test02 {
        public static void main(String[] args) {
             WebDriver driver=new FirefoxDriver();
             driver.manage().window().maximize();
             driver.get("http://www.baidu.com/");
             
             WebElement input =driver.findElement(By.id("kw"));
             // 输入内容
             input.sendKeys("seleniumm");
             // 删除多余的m
             input.sendKeys(Keys.BACK_SPACE);
             // 输入空格+教程
             input.sendKeys(Keys.SPACE);
             input.sendKeys("教程");
             
             // ctrl+a
             input.sendKeys(Keys.CONTROL,"a");
             
             // ctrl+x
             input.sendKeys(Keys.CONTROL,"x");
             
             // ctrl+v
             input.sendKeys(Keys.CONTROL,"v");
             
             // 通过回车键 查询
             input.sendKeys(Keys.ENTER);
             
             driver.close();
             
        }
}

 

 

4.6  获得验证信息

getTitle():用于获得当前页面的title。
getCurrentUrl() :用户获得当前页面的URL。

4.7  设置元素等待

4.7.1 timeouts方法

WebDriver提供了几种方法来等待元素。


·implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
·setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
·pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常

4.7.2 sleep休眠方法

Thread.sleep()方法

当执行到sleep()方法时会固定的休眠所设置的时长(这里以毫秒为单位);然后再继续执行。
注意,这里的Thread.sleep()方法不能直接使用,必须加上异常的处理。
throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。  

package com.cy.selenium;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Wait {
  public static void main(String[] args) {
        WebDriver driver=new FirefoxDriver();
        driver.manage().window().maximize();
        //页面加载超时时间为5s
        driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
        
        driver.get("http://www.baidu.com/");
        
         //定位对象时间5s,还没订到位置报异常
      driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);    
        driver.findElement(By.id("kww")).sendKeys("selenium");
        // Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"kww"}
        
        //异步脚本的超时时间为5s
      driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);
      
      
      // Thread.sleep 需要异常处理
      try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
      
      
      
        
        driver.close();
}
}

 

相关文章
|
15小时前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
9 2
|
2天前
|
Java API
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
【JAVA进阶篇教学】第三篇:JDK8中Stream API使用
|
3天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
3天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
9 0
|
11天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第1天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的函数式编程语法,可以简化代码并提高可读性。Stream API是一种用于处理集合的新工具,可以方便地进行数据操作和转换。通过结合Lambda表达式和Stream API,我们可以更加简洁高效地编写Java代码。
|
15天前
|
设计模式 Java API
Java 可扩展 API 设计:打造灵活的应用架构
【4月更文挑战第27天】设计可扩展的 API 是构建灵活、易于维护的应用程序架构的关键。Java 提供了丰富的工具和技术来实现这一目标,使开发者能够构建具有高度可扩展性的应用程序。
37 4
|
15天前
|
Java API 开发者
【专栏】Java 8的Stream API是处理集合数据的新方式,强调简洁和声明式编程
【4月更文挑战第27天】Java 8的Stream API是处理集合数据的新方式,强调简洁和声明式编程。它基于延迟执行和惰性求值,提供创建、中间操作(如filter、map)和终端操作(如forEach、collect)。示例展示了如何通过Stream排序、过滤、映射和聚合数据。
|
17天前
|
存储 SQL Java
Java8 Stream API 详解:流式编程进行数据处理
Java8 Stream API 详解:流式编程进行数据处理
|
17天前
|
安全 Java 大数据
|
18天前
|
前端开发 Java API
JavaSE&Java8 时间日期API + 使用心得
JavaSE&Java8 时间日期API + 使用心得
16 0