Selenium的PageFactory在大型项目中的应用
出路出路,走出去了,总是会有路的;困难苦难,困在家里就是难。
因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了。
在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常 操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以设计适应项目的一套自动化测试代码结构,基本的思路就是对每一个页面都创建一个相应 的PageObject类,如果是公共的模板页面当然只建立一个就可以了。这样下来就相当于建立了很多基础页面一样,如果项目开发的过程中还有完整的文档 或者足够详细的用户故事,那么就简直太完美了~~因为这样你可以减少很多次的IDE----Browser之间的切换、查找、测试工作,真的方便很多。但 是这个看项目而定吧,这种细致入微的文档很多团队似乎都没能做到。但是笔者还是真的希望在产品初期或项目开始的时候有完整的文档给我们这些自动化测试的人 员手中,这样可以大大加快我们自动化测试代码的编写。绕的有点远了。。。回归正题,如何做这种一个页面一个基础类的实现呢?最实际的,看代码:
public class PageObject {
private WebElement searchTypeSng;
private WebElement fromCity;
private WebElement toCity;
private WebElement fromDate;
public String calDate(int nextDays) {
// 当前日期加 n 天之后
Date date = DateUtils.addDays(new Date(), nextDays);
// 格式化时间格式
return DateFormatUtils.ISO_DATE_FORMAT.format(date);
}
public void searchTrip(WebDriver driver,String from, String to ,String date) {
BaseUtils.clearAndTypeString(driver,fromCity, from);
BaseUtils.clearAndTypeString(driver,toCity, to);
BaseUtils.clearAndTypeString(driver,fromDate, date);
searchTypeSng.submit();
}
}
测试执行:
public class UsingPageObject {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
eventDriver.register(new MyWebDriverListener());
eventDriver.get("http://flight.qunar.com/");
PageObject object = PageFactory.initElements(driver, PageObject.class);
String date = object.calDate(30);
object.searchTrip(driver,"北京", "厦门", date);
}
}
这个时候就完成对搜索这一功能的冒烟测试,测试执行代码没有使用TestNG,只是直接用了一个main函数。为了写博客简单方便,不推荐大家效仿。
如果还需要测试其它功能和使用其它节点,直接在PageObject类中加入相应的Field即可。
分割线-------------------------------------------------------------------------------------------------分割线
写到这里,如果没用过这个方法的人会越看越晕,现在简单的讲解一下它执行的原理:
在 PageObject类中我们创建的Field的名称是和页面有一定的对应关系的,不是随意取的,如果像上面代码这么写,默认的selenium会根据 Id最先进行元素查找,如果没有查找到再通过name进行查找,下面的我就不说了,因为你已经想到了。。。如果你担心页面的不规范或者复杂度比较高,容易 产生ID,name,Css等的冲突,selenium不能准确的识别元素, 那么请往下看:
selenium还提供了一种注解的方式,还是直接上代码:
public class PageObject {
private WebElement searchTypeSng;
@FindBy(name="fromCity")
private WebElement fromCity;
@FindBy(name="toCity")
private WebElement toWhere;
private WebElement fromDate;
public String calDate(int nextDays) {
// 当前日期加 n 天之后 n=30
Date date = DateUtils.addDays(new Date(), nextDays);
// 格式化时间格式
return DateFormatUtils.ISO_DATE_FORMAT.format(date);
}
public void searchTrip(WebDriver driver,String from, String to ,String date) {
BaseUtils.clearAndTypeString(driver,fromCity, from);
BaseUtils.clearAndTypeString(driver,toWhere, to);
BaseUtils.clearAndTypeString(driver,fromDate, date);
searchTypeSng.submit();
}
}
当你看到这两个annotations的时候,你已经明白了,是的,selenium提供注解的方式对页面的元素进行准确的定位,可
以参考的关键字有:className、css、id、linkText、name、partialLinkText、tagName、xpath.
另外selenium还提供了2个关键字,一个是how,另一个是using,如何使用它们就不在这里写了,因为笔者觉得,用这两个关键字更麻烦,理解起来也麻烦。
关于PageObject & PageFactory的使用,就简单的写了这么多,关于PageFactory还有很多知识,我会抽出时间写在下篇文章里,如果有正在使用这种模式的朋友,请多多批评和指点,相互讨论学习。
Selenium的PageFactory在大型项目中的应用的更多相关文章
- SLAM+语音机器人DIY系列:(二)ROS入门——8.理解roslaunch在大型项目中的作用
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- Egret的第三方库制作,以及在大型项目中的应用
目录: 一 创建第三方库 二 TypeScript库 三 JavaScript库 四 第三方库制作在大型RPG中的实际应用 参考: 第三方库的使用方法 目标: 本文目的是将现有游戏的框架制作成第三方库 ...
- jfinal想用到中大型项目中的项目经验分享
jfinal 用在大项目中更加方便实用,节省无数的开发时间,代码量相对 SSH 减少 75% 至 90%,对于项目结构来说,简单提以下几点: 1:先分大模块,大模块内部可以根据划分的model分成子包 ...
- 【Atom】在一个中/大型项目中,那些好用而强大的atom功能
作为一个学生党,一开始使用atom时候并没有意识到atom一些小功能的巨大作用,直到自己实习参与了项目,才知道这些功能在一个项目中是能极大提高工作效率的开发利器 下面是一位不愿意透露其姓名的彭 ...
- Selenium的PageFactory & PageObject 在大型项目中的应用
因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉 ...
- 161010、在大型项目中组织CSS
编写CSS容易. 编写可维护的CSS难. 这句话你之前可能听过100次了. 原因是CSS中的一切都默认为全局的.如果你是一个C程序员你就知道全局变量不好.如果你是任何一种程序员,你都知道隔离和可组合的 ...
- 160901、在大型项目中组织CSS
编写CSS容易. 编写可维护的CSS难. 这句话你之前可能听过100次了. 原因是CSS中的一切都默认为全局的.如果你是一个C程序员你就知道全局变量不好.如果你是任何一种程序员,你都知道隔离和可组合的 ...
- Atitit.css 规范 bem 项目中 CSS 的组织和管理
Atitit.css 规范 bem 项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 ...
- 大型项目使用Automake/Autoconf完成编译配置
http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...
随机推荐
- oc 中四种实例变量的范围类型@private@protected@public@package
To enforce the ability of an object to hide its data, the compiler limits the scope of instance vari ...
- 后台字符串转化成json
function remotecontrol() { var progressbar = $("#progressbar"); $.ajax({ url: myurl, type: ...
- JAVA简单学习
枚举类型:Size s=Size.SMALL; //从字串转换为枚举 枚举可用于for,switch语句中 运行EnumTest.java 枚举类型是引用类型,不属于原始数据类型,可以使用“==”和e ...
- Matlab中rand('state',sum(clock))解析
一.问题来源 来自于一份PSO代码,PSO中需要初始化粒子位置和速度. 二.问题探究 众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受.但是,如果我们知道伪随机数的初始 ...
- centos64位安装32位C/c++库
yum install glibc.i686 glibc-devel.i686 yum install libstdc++.i686yum install libstdc++-devel.i686yu ...
- 团体程序设计天梯赛-练习集L1-017. 到底有多二
L1-017. 到底有多二 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个整数“犯二的程度”定义为该数字中包含2的个数与其 ...
- uva 437 hdu 1069
dp 将石块按三个面存入队列 按底面积排序 dp就最大高度 按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...
- Python的作用域
Python的作用域 转自:http://www.cnblogs.com/frydsh/archive/2012/08/12/2602100.html Python是静态作用域语言,尽管它自身是一个动 ...
- 用CodeViz绘制函数调用关系图(call graph)
CodeViz是<Understanding The Linux Virtual Memory Manager>(at Amazon,下载地址在页尾)的作者 Mel Gorman 写的一款 ...
- 分析java程序中cpu占用过高的线程
http://blog.csdn.net/jgwei/article/details/12079147 http://hllvm.group.iteye.com/group/topic/38893 h ...