我们来看一下官网提供的代码写法,即最原始的写法:

driver.findElement(By.id("kw")).click()

这样写是没任何问题的,但这样没有把元素对象,数据,业务逻辑分离,达不到装逼的效果,为了使这三方面分离,我们先来分析一下这句代码:这里面涉及到了三个对象:driver对象,By对象,WebElement对象。由于现在大多数人使用了所谓的Page-Object模式,具体请参考我另一篇博客:

http://www.cnblogs.com/zhangfei/p/3456159.html

这样即达到了元素对象与脚本分离的效果,最后把上面这句代码可以变为这样的:

page.getElement("百度按钮").click();

这样以后,似乎看起来很不错了,但是有的人希望在click时,自动的输出log,但click是WebElement的方法,又没接口,又不让继承,无法办到,倒是可以使用AOP框架来注入,亦或者字节码注入的方式,这两种方式,我都只是听过,根本不会用啊,暂且不表。我们来看看大多数人使用的方法:

        public void click(String key){
WebElement element = this.getElement("key");
System.out.println("click the: "+element.toString());
element.click();
} page.click("百度按钮");

这样似乎也达到了log自动输出的效果,但是,这样好看吗?不恶心吗?有面向对象的感觉吗?尼玛click是个动作,原本是先找到对象再去点击,你这样写,就是先发出一个点击动作,然后再去寻找对象,太恶心了,简直不能接受啊。经过一位看过我文档的人的女士提示,我加工了一下,是这样的封装方式:

1.先写一个ExtendWebElement类:用于存放所有的webdriver的api

package com.test.base;

import org.openqa.selenium.WebElement;

public class ExtendWebElement {

	private WebElement element;

	public void setElement(WebElement element) {
this.element = element;
} public void click(){
System.out.println("click the: "+element.toString());
/**
* do something
*/
element.click();
/**
* do something
*/
} }

2.在Locator类(即元素管理篇中的Deml类)里,添加

private ExtendWebElement extWebElement;
public Locator(WebDriver driver) {
this.driver = driver;
extWebElement = new ExtendWebElement();
}

3.更改getLocator方法:

private ExtendWebElement getLocator(String key, String[] replace, boolean wait) {
WebElement element = null;
if (ml.containsKey(key)) {
Map<String, String> m = ml.get(key);
String type = m.get("type");
String value = m.get("value");
if (replace != null)
value = this.getLocatorString(value, replace);
By by = this.getBy(type, value);
if (wait) {
element = this.watiForElement(by);
boolean flag = this.waitElementToBeDisplayed(element);
if (!flag)
element = null;
} else {
try {
element = driver.findElement(by);
} catch (Exception e) {
element = null;
}
}
} else
Log.logInfo("Locator " + key + " is not exist in " + yamlFile
+ ".yaml");
extWebElement.setElement(element);
return extWebElement;
}

4.最后的调用方式还是:

page.getElement("百度按钮").click();

且你能在里面添加你想要添加的代码,最终的脚本,根本不用改啥。。。简直屌爆!

当然,这个也有弱点,就是要把常用的webdriver的API都封装在这个ExtendWebElement类里。。。

java webdriver的api的封装的更多相关文章

  1. Atitit. C# java 的api 目录封装结构映射总结

    Atitit. C#  java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent ...

  2. WebDriver基本API使用(基于Java)V1.0

    WebDriver基本API使用(基于Java)V1.0http://www.docin.com/p-803032877.html

  3. WebDriver基本API使用手册(基于Java和C#)

    WebDriver基本API使用手册(基于Java和C#) http://www.docin.com/p-747728551.html

  4. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

  5. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  6. Java 基础 常用API (System类,Math类,Arrays, BigInteger,)

    基本类型包装类 基本类型包装类概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类 ...

  7. Java 之常用API(二)

    Object类 & System类 日期相关类 包装类 & 正则表达式 Object类 & System类 1.1 Object类 1.1.1 概述 Object类是Java语 ...

  8. selenium + python自动化测试unittest框架学习(五)webdriver的二次封装

    因为webdriver的api方法很长,再加上大多数的定位方式是以xpath方式定位,更加让代码看起来超级长,为了使整体的代码看起来整洁,对webdriver进行封装,学习资料来源于虫师的<se ...

  9. Java学习(API及Object类、String类、StringBuffer字符串缓冲区)

    一.JAVA的API及Object类 1.API 概念: Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就 ...

随机推荐

  1. UOJ Round #1 题解

    题解: 质量不错的一套题目啊..(题解也很不错啊) t1: 首先暴力显然有20分,把ai相同的缩在一起就有40分了 然后会发现由于原来的式子有个%很不方便处理 so计数题嘛 考虑一下容斥 最终步数=初 ...

  2. poj2391

    链接:http://poj.org/problem?id=2391 题解: 二分答案,变成判定性问题,只需把能经过的边在当前图中联通 另外对牛和牛棚要拆点 代码: #include <cstdi ...

  3. Jquery empty() remove() detach() 方法的区别

    方法简介: empty() This method removes not only child (and other descendant) elements, but also any text ...

  4. 第二章HTML,JavaScript简介

    概念: URL:网上标准资源的地址. HTTP协议:客户端发出请求和得到回应的标准协议. HTML:超文本标记语言.是网络上的通用语言,也是网络web语言基础. 2.1服务器与浏览器 举个例子:A同学 ...

  5. 097实战 关于ETL的几种运行方式

    一:代码部分 1.新建maven项目 2.添加需要的java代码 3.书写mapper类 4.书写runner类 二:运行方式 1.本地运行 2.集群运行 3.本地提交集群运行 三:本地运行方式 1. ...

  6. 076 Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)

    1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...

  7. Unity报错 : BCE0004: Ambiguous reference 'preview': CameraMotionBlurEditor.preview, UnityEditor.Editor.preview.

    建立项目版本为Unity4.6,改为5.3.4版本,运行项目报如下错误: “BCE0004: Ambiguous reference 'preview': CameraMotionBlurEditor ...

  8. Couple number

    P1348 Couple number 我其实找规律了的,然后也没仔细分析,这个题多巧妙. C=a^2-b^2=(a+b)(a-b) 对于任意a而言,加减同一个数得到的数的奇偶性相同,故c=奇数或4的 ...

  9. SpringBoot+Mybatis多模块(module)项目搭建教程

    一.前言 最近公司项目准备开始重构,框架选定为SpringBoot+Mybatis,本篇主要记录了在IDEA中搭建SpringBoot多模块项目的过程. 1.开发工具及系统环境 IDE:Intelli ...

  10. 获取img的高

    我们可以通过css设置图片的width,然后通过 clientWidth获取图片的宽,但是这个宽似乎是css里面定义的width值,但是对于图片的高,使用 clientHeight 来获取似乎是有些问 ...