出路出路,走出去了,总是会有路的;困难苦难,困在家里就是难。
因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看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/");
<span style="color:#CC0000;"><strong>PageObject object = PageFactory.initElements(driver, PageObject.class);</strong></span>
<strong><span style="color:#CC0000;">String date = object.calDate(30);</span>
<span style="color:#CC0000;">object.searchTrip(driver,"北京", "厦门", date);</span></strong>
}
}
这个时候就完成对搜索这一功能的冒烟测试,测试执行代码没有使用TestNG,只是直接用了一个main函数。为了写博客简单方便,不推荐大家效仿。
如果还需要测试其它功能和使用其它节点,直接在PageObject类中加入相应的Field即可。
分割线-------------------------------------------------------------------------------------------------分割线
写到这里,如果没用过这个方法的人会越看越晕,现在简单的讲解一下它执行的原理:
在PageObject类中我们创建的Field的名称是和页面有一定的对应关系的,不是随意取的,如果像上面代码这么写,默认的selenium会根据Id最先进行元素查找,如果没有查找到再通过name进行查找,下面的我就不说了,因为你已经想到了。。。如果你担心页面的不规范或者复杂度比较高,容易产生ID,name,Css等的冲突,selenium不能准确的识别元素, 那么请往下看:
selenium还提供了一种注解的方式,还是直接上代码:
public class PageObject {
private WebElement searchTypeSng;
<span style="color:#CC0000;"><strong>@FindBy(name="fromCity")</strong></span>
private WebElement fromCity;
<span style="color:#CC0000;"><strong>@FindBy(name="toCity")</strong></span>
private WebElement <span style="background-color: rgb(255, 204, 255);"><span style="color:#993399;">toWhere</span></span>;
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 Page Object Generator。 该模板使用表达式,这是一种简洁的无逻辑语义模板语言。 这是BETA的早期版本,预计会具有粗糙的边缘和有限的功能。 目前,它支持3个...
PageObject简称PO,表示页面对象。 目的:主要实现代码的分层设计,减少代码的维护量,表现在页面元素和元素操作的相互分离。 主要核心元素: 基础类:用来封装基础类,比如驱动、元素的二次定位。 页面层:继承基础...
语言:English (United States) 灵活灵活的Selenium页面对象模型生成器,可提高敏捷测试过程的速度。...***要利用最新更改,需要“还原为出厂选项” ***有关如何使用生成的页面对象文件的更多信息:Java:...
After that, the use of design patterns such as data - driven tests and PageFactory are demonstrated. You will then be familiarised with extending Selenium WebDriver API by implementing custom tasks ...
主要介绍了PageFactory设计模式基于python实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
学完课程以后,你将拥有完整的Selenium Webdriver知识 你将具备从头开始设计Page Object、Page Factory、DATADRIVEN等搭建自动化框架的能力 用100多个实例对Selenium现实场景应用进行深入理解 全面了解TestNG, Maven...
Selenium 3.11.0和Selenium的Page Object Model的PageFactory类的弃用。 3.与Specflow和Selenium C#的范围报告集成 我们将使用Specflow和Selenium C#创建BDD样式的范围报告,并在现有代码库中进行最少的代码更改...
一个灵活灵活的Selenium页面对象模型生成器,以提高敏捷测试过程的速度。 Selenium Page Object Generator是改善您...***要利用最新更改,需要“还原为出厂选项” ***有关如何使用生成的页面对象文件的更多信息:Java:...
Page-Factory-2是用于自动化测试的开源Java框架,允许您以样式开发自动测试,重点是使用PageFactory模式。 关于Page Factory 2 该工具允许您以人类可读的语言编写自动测试,从而降低测试开发人员的入门门槛,并...
PageObjectModel,Singleton和Factory设计模式 PageFactory,By,String ThreadLocal->线程安全 范围报告5.0.5 用于测试数据维护的Excel工作表(数据提供者) 属性或Json作为配置文件 使用TestNg侦听器,例如注释...
这是通过使用 PageObject 和 PageFactory 模型等设计模式开发的 先决条件 用户应具备自动化测试的基本知识。 具有 Selenium、Java、Maven 和 TestNG 知识的工作知识将是一个额外的优势。 框架中的工具栈 框架/库 ...
搜索Google_Java Java:Selenium WebDriver PageObject 示例:Google 搜索 Selenium HQ 站点使用 Selenium WebDriver PageObjects 和 PageFactory 的示例。 在 src/org/SearchGoogle 中找到的源代码:...
a) PAGEOBJECT b) PAGE FACTORY c) 用 Excel 文件驱动的数据 d) 网格 请按照网格的步骤操作 用于设置 HUB java -jar selenium-server-standalone-2.25.0.jar -port 4444 -role hub -nodeTimeout 1000 现在打开...
Widgeon 为 Capybara 2.0.3 提供了 PageObject 模式的实现,以与 Ruby 1.8.7 兼容。 稍后它将支持最新版本的 Capybara 和 Ruby,与旧版本的兼容性将留在 gem 对应的分支中。 Widgeon 基于tooth gem ( ) 并在基于自...
xml java系统源码 Selenium ...引入了PageObject的思想,将每个页面的控件和操作封装成一个个Page类,然后在实现业务逻辑时,只需要调用对应的Page类即可。 1.2)PageFactory类的引入是为了更好的支
Android系统测试和Web的测试类似,有两类自动化的方式:录制回放与基于... 在Web自动化测试中有一个比较好的实践是采用PageFactory的方式(参考文章:http://chon.techliminal.com/page_object/#/intro),Selenium2