我们都知道, 在本地创建java项目后,引入selenium-java-2.35.0.jar   selenium-support-2.35.0.jar junit-4.8.1.jar等等jar包之后,(或者创建Java maven项目,在pom.xml的<dependency></dependency>中添加依赖, Maven能够自动下载相应版本的jar包), 之后, 就可以在本地开发selenium自动化脚本

在完全没有封装的情况下, 一般的顺序是:

1)得到浏览器驱动:

WebDriver driver=new FirefoxDriver();

2)通过WebDriver提供的方法打开网页:

driver.get("urlString");  或者  driver.navigate.to("urlString")

3)通过driver.findElement(By.***)找到元素

找元素的过程, 需要做等待处理, 可以用Thread.sleep(), 然而为了提高脚本的效率和健壮性, 一般不采用这种等待方式,可以通过采用 WebDriverWait类+ExpectedConditions接口方式来灵活等待元素出现,具体处理可以见“selenium1.0和selenium2.0页面等待处理详解

4)对元素进行操作

上面步骤3得到元素WebElement,通过WebElement提供的方法, 对元素进行操作(click()/sendKeys()/submit()/getText())等等

5)通过打开页面、找元素、等待元素、对元素操作等一系列模拟人为动作后,第5步就需要做真正要测试的目的,即检查操作后的结果

比如, 验证某个元素是否出现, 验证是否输出正确的结果, 此时的步骤可以是试图去找元素,待 wait.until()抛异常后, 还是没找到元素的话, 判断为该元素不存在。 在验证输出结果时,重复上述3) 4) 5)步骤取出元素, 再通过if  String.contains()  或者String.equals()来判断输出结果

显然, 上述是比较繁琐的过程, 写出来的脚本, 也会出现很多冗余的相同操作代码,这样的脚本,维护起来吃力, 下面,将对上面的过程做一个小小封装, 这样可以只调用一个方法, 就可以完成 “查找/等待/操作元素” 、 “查找/等待/判断元素是否存在” 或者  “查找/等待/判断输出内容” 等等

1、

设定允许最长的等待时间:

WebDriverWait wait=new WebDriverWait(driver, 10);

2、查找元素是否存在的过程,放在一个类里面

class ElementExistOrNot implements Function<WebDriver, Boolean>{//第一个参数为apply方法的参数类型,第二个参数为apply方法的返回类型
private By by;
private String sign; public ElementExistOrNot(By by, String sign) {
this.by = by;
this.sign = sign;
}
@Override
public Boolean apply(WebDriver driver) {
try{
WebElement e=driver.findElement(by);
if(sign.equals("yes")){
return true;
}else{
return false;
}
}catch (Exception e){
if(sign.equals("yes")){
return false;
}else{
return true;
}
}
}
}

3、进行简单封装成方法供调用

//完成对元素的 ”查找+等待+验证存在性“ 的封装
public void waitUntilElementExist(By by){
ElementExistOrNot isTrue=new ElementExistOrNot(by, "yes");
try{
wait.until(isTrue);
}catch (Exception e){
fail("Element [" + by + "] should presents!");
}
}

4、有了这些方法后,再继承这些方法所在的类, 就可以轻松调用啦~

PS:

另外,还有其他一些 “查找/等待/操作元素” 、  “查找/等待/判断输出内容” 等等,思路基本相同, 下面再提供一些封装方式的完整源码:

package com.jennifer.functiontest;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.google.common.base.Function; public class jenniferBase extends Assert {
protected WebDriver driver;
protected WebDriverWait wait; @Before
public void init(){
driver=new FirefoxDriver();
wait=new WebDriverWait(driver, 10);
} //得到带有等待机制的WebElement(对“找元素+等待”的封装)
public WebElement e(By by){
try{
waitUntilElementExist(by);
return driver.findElement(by);
}catch (Exception e) {
fail("Can't find element: ["+by+"]");
}
return null;
}
//完成对元素的“查找+等待(直到元素存在)+验证+点击 操作”的封装
public void clickAndWait(By by){
e(by).click();
} //完成对元素的 ”查找+等待+验证存在性“ 的封装
public void waitUntilElementExist(By by){
ElementExistOrNot isTrue=new ElementExistOrNot(by, "yes");
try{
wait.until(isTrue);
}catch (Exception e){
fail("Element [" + by + "] should presents!");
}
}
//完成对元素的“查找+等待+验证不存在性”的封装
public void waitUntilElementNotExist(By by){
ElementExistOrNot isTrue=new ElementExistOrNot(by, "no");
try{
wait.until(isTrue);
}catch (Exception e) {
fail("Element [" + by + "] should not presents!");
}
} //完成对元素的“查找+等待+验证其text存在性”的封装
public void waitUntilElementEqualsText(By by,String s){
waitUntilElementExist(by);
ElementEqualsOrNot isTrue=new ElementEqualsOrNot(by, "yes", s, "text");
try{
wait.until(isTrue);
}catch (Exception e) {
fail("Element ["+by+"] text should equals"+s+"but not it equals"+e(by).getText());
}
}
//完成对元素的“查找+等待+验证其value存在性”的封装
public void waitUntilElementEqualsValue(By by,String s){
waitUntilElementExist(by);
ElementEqualsOrNot isTrue=new ElementEqualsOrNot(by, "yes", s, "value");
try{
wait.until(isTrue);
}catch (Exception e) {
fail("Element ["+by+"] value should equals:"+s+"but not it equals:"+e(by).getValue());
}
} @After
public void tearDown(){
driver.quit();
}
} class ElementExistOrNot implements Function<WebDriver, Boolean>{//第一个参数为apply方法的参数类型,第二个参数为apply方法的返回类型
private By by;
private String sign; public ElementExistOrNot(By by, String sign) {
this.by = by;
this.sign = sign;
}
@Override
public Boolean apply(WebDriver driver) {
try{
WebElement e=driver.findElement(by);
if(sign.equals("yes")){
return true;
}else{
return false;
}
}catch (Exception e){
if(sign.equals("yes")){
return false;
}else{
return true;
}
}
}
}
class ElementEqualsOrNot implements Function<WebDriver,Boolean>{
private By by;
private String sign;
private String s;
private String textOrValue; public ElementEqualsOrNot(By by, String sign, String s, String textOrValue) {
this.by = by;
this.sign = sign;
this.s = s;
this.textOrValue = textOrValue;
} @Override
public Boolean apply(WebDriver driver) {
WebElement e=driver.findElement(by);
if(sign.equals("yes")){ //确定存在性
if(textOrValue.equals("text")){ //确定text的存在性
return e.getText().equals(s);
}else{ //确定value的存在性
return e.getValue().equals(s);
}
}else{//确定不存在性
if(textOrValue.equals("text")){
return !e.getText().equals(s);
}else{
return !e.getValue().equals(s);
}
} }
}

以上只是个人的一点封装思路,其他有别的更好封装方案, 请指教^_^

selenium2.0的初步封装(java版本)的更多相关文章

  1. 复利计算5.0(改成Java版本)与 单元测试

    //由于C语言版本不方便单元测试,所以改成了java版本,部分代码如下:import java.util.Scanner; public class FuLi{ public static void ...

  2. Selenium二次封装-Java版本

    package com.yanfuchang.selenium.utils; import java.awt.AWTException; import java.awt.Robot; import j ...

  3. linux ubuntu下如何安装并且切换java版本(Unsupported major.minor version 52.0)

    最近在做一个dcos(数据中心操作系统)的东西,需要用marathon来做进程管理.遗憾的是0.6版本的marathon在API方面很是缺少,换成了0.15版本之后,运行时提示“Unsupported ...

  4. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到17 了吗?

    2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M1. 下面一起来来看看Spring Boot 3.0.0 M1版本都有哪些重大变化: Java基线从 ...

  5. SerialPort-4.0.+ 使用说明(Java版本)

    SerialPort-4.0.+ 项目官网 Kotlin版本使用说明 介绍 SerialPort 是一个开源的对 Android 蓝牙串口通信的轻量封装库,轻松解决了构建自己的串口调试APP的复杂程度 ...

  6. httpclient初步封装

    Http通信方式:HttpURLConnection和HttpClient HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便HttpClient就是一个增强版的 ...

  7. selenium 使用教程详解-java版本

    第一章 Selenium 概述 1.1.Selenium 发展史 ​ Selenium是一系列基于Web的自动化工具,提供一套测试函数,用于支持Web自动化测试.函数非常灵活,能够完成界面元素定位.窗 ...

  8. selenium2.0(WebDriver) API

    1.1  下载selenium2.0的包 官方download包地址:http://code.google.com/p/selenium/downloads/list 官方User Guide:  h ...

  9. 转:Selenium2.0之grid学习总结

    (一)介绍: Grid的功能: 并行执行 通过一个中央管理器统一控制用例在不同环境.不同浏览器下运行 灵活添加变动测试机 (二)快速开始 这个例子将介绍如何使用selenium2.0的grid,并且注 ...

随机推荐

  1. JavaScript 作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  2. 【转】WPF获取外部EXE图标最简单的方法

    首先在工程添加对System.Drawing的引用 创建以下方法: public static ImageSource GetIcon(string fileName) { System.Drawin ...

  3. 图片裁切插件jCrop的使用心得(一)

    之前,项目经理为了提升用户体验让我在之前图片上传功能的基础上实现图片的裁切功能,作为一个前端小白来说听了这个需求心里一紧,毕竟没有做过,于是跟项目经理商量要先做下调研.在一上午的调研中发现了jCrop ...

  4. 一个空格也可以让html格式显示大不相同

    今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...

  5. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

  6. codeforces edu round3

    B. The Best Gift  传送门:http://codeforces.com/problemset/problem/609/B Emily's birthday is next week a ...

  7. Kinetic使用注意点--animation

    new Animation(func, layers) 参数: func:每一帧都会调用一次此函数.此函数接收一个包含四个元素的参数对象,时间单位均为毫秒. { timeDiff:"上一帧和 ...

  8. Spring MVC常用的注解

    @Controller @Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为 类名称开头字母小写,你也可以自己指定,如下 方法一: @Controller ...

  9. 通过 SignalR 类库,实现 ASP.NET MVC 的实时通信

    在本文中,您将学到在现有 ASP.NET MVC 框架的 CRUD 项目中,如何使用 SignalR 类库,显示来自数据库的实时更新.在这一主题中,我们将重点放在在现有 ASP.NET MVC 框架的 ...

  10. 【NOIP 2014 DAY1 T3】飞扬的小鸟(DP)

    题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...