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

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. 【AtCoder】Tenka1 Programmer Contest

    C - 4/N 列出个方程枚举解一下 #include <bits/stdc++.h> #define fi first #define se second #define pii pai ...

  2. Educational Codeforces Round 26 E - Vasya's Function

    数论题还是好恶心啊. 题目大意:给你两个不超过1e12的数 x,y,定义一个f ( x, y ) 如果y==0 返回 0 否则返回1+ f ( x , y - gcd( x , y ) ); 思路:我 ...

  3. OpenCV中cv2的用法

    一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志  cv2.IMREAD_COLOR:默认参数 ...

  4. Ubuntu 18.04安装Codeblocks

    安装步骤: 一:首先安装简版CodeBlocks sudo apt install codeblocks 二:把编译环境,C库.C++库和Boost库装好 sudo apt install build ...

  5. 运行程序,解读this指向---case2

    片段1 var anum = 666; function funcTest1(){ var b = anum * 2; var anum = 6; var c = anum / 2; console. ...

  6. CF868 F. Yet Another Minimization Problem 决策单调优化 分治

    目录 题目链接 题解 代码 题目链接 CF868F. Yet Another Minimization Problem 题解 \(f_{i,j}=\min\limits_{k=1}^{i}\{f_{k ...

  7. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  8. BZOJ.4530.[BJOI2014]大融合(LCT)

    题目链接 BZOJ 洛谷 详见这 很明显题目是要求去掉一条边后两边子树sz[]的乘积. LCT维护的是链的信息,那么子树呢? 我们用s_i[x]来记录轻边连向x的子树的和(记作虚儿子),那么sum[x ...

  9. C# try catch finally简单介绍和应用

    今天看代码书的时候,有用到try--catch--finally,然后就查了下具体的注意事项和应用. 简单来说就是: try { //有可能出错误的代码或者代码片段       } catch{ // ...

  10. unity中尽量规避的C#写法

    首先想到的也就是重名的问题. 创建C#脚本的时候,引擎会搜索所有的文件夹里已有的C#脚本,若已经存在这个名字的脚本文件,那么系统就会报错:    再者,类名和方法名不能相同,理解来就是,方法名和类名相 ...