Selenium的PageFactory & PageObject 知多少

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

因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看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的PageFactory & PageObject 知多少

时间: 2024-10-05 06:17:31

Selenium的PageFactory & PageObject 知多少的相关文章

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

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

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模式

前面的文章介绍了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的PageFactory知多少

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

selenium 模拟登入知乎和微博

pip install selenium __author__ = 'admin' __date__ = 2017 / 11 / 3 from selenium import webdriver import time browser=webdriver.Chrome(executable_path="G:\ChromePortable_61.0.3141.7\chromedriver.exe") browser.get('https://www.zhihu.com/#signin')

Selenium+PageObject+Java实现测试用例

selenium:selenium是一个自动化测试工具,支持chrome,firefox,Safari等主流浏览器的.下载对应浏览器的驱动,就能使用selenium对web页面进行测试. PageObject:其实是一种设计模式,总的来说就是把每一个页面封装成一个对象.对页面的操作写成一个方法.好处在于当前端ui修改后,我们不需要到每一个测试用例上修改,只需要修改页面对应的类即可. 下面针对知乎登陆实现具体的测试用例. 项目的结构如下: 其实pages存放的每个页面对应的对象,tests文件夹是

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

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

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

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