Selenium的PageFactory知多少

出路出路,走出去了,总是会有路的;困难苦难,困在家里就是难。

因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了。

在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常
操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以设计适应项目的一套自动化测试代码结构,基本的思路就是对每一个页面都创建一个相应
的PageObject类,如果是公共的模板页面当然只建立一个就可以了。这样下来就相当于建立了很多基础页面一样,如果项目开发的过程中还有完整的文档
或者足够详细的用户故事,那么就简直太完美了~~因为这样你可以减少很多次的IDE----Browser之间的切换、查找、测试工作,真的方便很多。但
是这个看项目而定吧,这种细致入微的文档很多团队似乎都没能做到。但是笔者还是真的希望在产品初期或项目开始的时候有完整的文档给我们这些自动化测试的人
员手中,这样可以大大加快我们自动化测试代码的编写。绕的有点远了。。。回归正题,如何做这种一个页面一个基础类的实现呢?最实际的,看代码:


 1 public class PageObject {
2
3 private WebElement searchTypeSng;
4 private WebElement fromCity;
5 private WebElement toCity;
6 private WebElement fromDate;
7
8 public String calDate(int nextDays) {
9 // 当前日期加 n 天之后
10 Date date = DateUtils.addDays(new Date(), nextDays);
11 // 格式化时间格式
12 return DateFormatUtils.ISO_DATE_FORMAT.format(date);
13 }
14
15 public void searchTrip(WebDriver driver,String from, String to ,String date) {
16 BaseUtils.clearAndTypeString(driver,fromCity, from);
17 BaseUtils.clearAndTypeString(driver,toCity, to);
18 BaseUtils.clearAndTypeString(driver,fromDate, date);
19 searchTypeSng.submit();
20 }
21
22 }

测试执行:


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还提供了一种注解的方式,还是直接上代码:


 1 public class PageObject {
2 private WebElement searchTypeSng;
3 @FindBy(name="fromCity")
4 private WebElement fromCity;
5 @FindBy(name="toCity")
6 private WebElement toWhere;
7 private WebElement fromDate;
8
9 public String calDate(int nextDays) {
10 // 当前日期加 n 天之后 n=30
11 Date date = DateUtils.addDays(new Date(), nextDays);
12 // 格式化时间格式
13 return DateFormatUtils.ISO_DATE_FORMAT.format(date);
14 }
15
16 public void searchTrip(WebDriver driver,String from, String to ,String date) {
17 BaseUtils.clearAndTypeString(driver,fromCity, from);
18 BaseUtils.clearAndTypeString(driver,toWhere, to);
19 BaseUtils.clearAndTypeString(driver,fromDate, date);
20 searchTypeSng.submit();
21 }
22
23 }

当你看到这两个annotations的时候,你已经明白了,是的,selenium提供注解的方式对页面的元素进行准确的定位,可
以参考的关键字有:className、css、id、linkText、name、partialLinkText、tagName、xpath.

另外selenium还提供了2个关键字,一个是how,另一个是using,如何使用它们就不在这里写了,因为笔者觉得,用这两个关键字更麻烦,理解起来也麻烦。

关于PageObject
&
PageFactory的使用,就简单的写了这么多,关于PageFactory还有很多知识,我会抽出时间写在下篇文章里,如果有正在使用这种模式的朋友,请多多批评和指点,相互讨论学习。

时间: 2024-08-07 08:36:27

Selenium的PageFactory知多少的相关文章

Selenium的PageFactory & PageObject 知多少

出路出路,走出去了,总是会有路的:困难苦难,困在家里就是难. 因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了. 在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以设

浅析selenium的PageFactory模式

前面的文章介绍了selenium的PO模式,见文章:http://www.cnblogs.com/qiaoyeye/p/5220827.html.下面介绍一下PageFactory模式. 1.首先介绍FindBy类: For example, these two annotations point to the same element: @FindBy(id = "foobar") WebElement foobar; @FindBy(how = How.ID, using = &q

selenium(六)Page Object模式(使用selenium的PageFactory)

PageObject 类 import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class PageObject { private String url="http://www.baidu.com&qu

Selenium的PageFactory & PageObject 在大型项目中的应用

因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉得写的不错就记录下来了. 在使用selenium做UI测试的时候,往往并不是页面的每个功能我们都要测试,总有一些经常要进行回归的功能,再细致一点的说,有一些节点是我们经常操作的,那么我从项目初期开始就进行自动化测试代码编写的话,我们可以设计适应项目的一套自动化测试代码结构,基本的思路就是对每一个页面

用python+selenium抓取知乎今日最热和本月最热的前三个问题及每个问题的首个回答并保存至html文件

抓取知乎今日最热和本月最热的前三个问题及每个问题的首个回答,保存至html文件,该html文件的文件名应该是20160228_zhihu_today_hot.html,也就是日期+zhihu_today_hot.html 代码如下: from selenium import webdriver from time import sleep import time class ZhiHu():    def __init__(self):       self.dr = webdriver.Chr

使用selenium模拟登录知乎

网上流传着许多抓取知乎数据的代码,抓取它的数据有一个问题一定绕不过去,那就是模拟登录,今天我们就来聊聊知乎的模拟登录. 获取知乎内容的方法有两种,一种是使用request,想办法携带cookies等必要参数去请求数据,但是使用requests的话,不仅要解析Cookies,还要获取XSRF,比较麻烦,所以我想到了selenium. 我直接控制Chrome请求知乎,然后模拟输入用户名和密码,这样不也可以吗,嘿嘿 接下来说一下大体流程: 首先控制selenium模拟请求知乎登录界面:https://

Selenium PageFactory使用

通过FindBy查找元素 @FindBy(id="notice01") private WebElement username; 相当于driver.findElement(By.id("notice01")); 示例: (1)测试类: import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.Assert; impo

Selenium:使用PageFactory实现PagaObject设计模式

软件测试培训WebDriver为了支持PageObject模式,内置了一个PageFactory的工厂类.接下来本文通过一个案例来讲下如何使用PageFactory. 首先定义一个PageObject下面这个Class定义了一个页面对象通过工厂的方式将目标页面上的元素都定义好并且定义了一个当前页面的一个执行步骤[关键词搜索] package cn.testfan; import org.openqa.selenium.WebElement; import org.openqa.selenium.

Selenium PageFactory

PageFactory是为了支持页面设计模式而开发出来的,它的方法在selenium.support库里面. PageFactory它提供初始化页面元素的方法,如果页面存在大量的AJAX的技术,只要页面更新一次,它就好重新查找一次元素,所以不会出现StaleElementException这个error, 如果你不想要它每次都更新,你可以加上@CacheLookup. 页面设计模式,可以提供你一个接口,然后你在这个接口上面,构建你自己项目中的页面对象,使用PageFactory使得测试更简单,更