selenium2 页面对象模型Page Object

开发Selenium WebDriver测试时,可以使用页面对象模型,这样可使得测试脚本有更高的可维护性,减少了重复的代码,把页面抽象出来。同时页面对象模型也提供了一个注释,帮助缓存远程,避免出现元素过期的问题。

// 定义百度搜索的输入框
	@FindBy(id = "kw")
	@CacheLookup
	public WebElement keyword_input;

  三行代码定义一个元素,是一个整体

@FindBy: 定义了你所有查找的元素是以什么方式定位的,此处用的是id,还可以用@FindBy(name = "xx"), @FindBy(className = "xx"), @FindBy(xpath = "xx"), @FindBy(css = "xx")等。

@CacheLookup:即找到元素之后就缓存元素,重复使用的时候可以加快测试速度

WebElement keyword_input:变量名

分离页面元素:

BDPage.java文件内容:

package page;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class BDPage {
	// 定义百度搜索的输入框
	@FindBy(id = "kw")
	@CacheLookup
	public WebElement keyword_input;

	// 定义百度搜索的搜索按钮
	@FindBy(id = "su")
	@CacheLookup
	public WebElement search_button;

	// 构造函数来初始化元素,即将元素映射到定义好的变量上
	public BDPage(WebDriver driver) {
		PageFactory.initElements(driver, this);
	}
}

BDPageTest.java文件代码:
package test;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import page.BDPage;

public class BDPageTest {
	WebDriver driver;

	@Test
	public void f() {
		BDPage bdp = new BDPage(driver);
		bdp.keyword_input.sendKeys("hello");
		bdp.search_button.click();
	}

	@BeforeTest
	public void beforeTest() {
		driver = new FirefoxDriver();
		driver.manage().window().maximize();
		driver.get("https://baidu.com");
	}

	@AfterTest
	public void afterTest() {
		driver.quit();
	}

}

  

即使实现的分离页面元素,也同样可以分离页面操作,即把一些操作封装到对应页面中。

 以下是打开百度主页,并输入“selenium”点击查询按钮的测试用例

 BaiDuPage.java文件代码:

package page;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class BaiDuPage {

	// 定义百度搜索的输入框
	@FindBy(id = "kw")
	@CacheLookup
	private WebElement BD_INPUT_KEYWORD;

	// 定义百度搜索的搜索按钮
	@FindBy(id = "su")
	@CacheLookup
	private WebElement BD_BUTTON_SEARCH;

	private final String url = "https://baidu.com";
	private static WebDriver driver;

	// 提供一个外部获得driver的方法
	public WebDriver getDriver() {
		return driver;
	}

	// 构造函数来初始化元素,即将元素映射到定义好的变量上

	public BaiDuPage() {
		driver = new FirefoxDriver();
		PageFactory.initElements(driver, this);
	}

	public void close() {
		driver.quit();
	}

	public void openUrl() {
		driver.get(url);
	}

	public void searchByKeyword() {
		BD_INPUT_KEYWORD.sendKeys("selenium");
		BD_BUTTON_SEARCH.click();
	}

}
BaiDuPageTest.java文件代码:
package test;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import page.BaiDuPage;

public class BaiDuPageTest {

	@Test
	public void f() {
		BaiDuPage baidupage = new BaiDuPage();
		baidupage.openUrl();
		baidupage.searchByKeyword();
		baidupage.close();
	}

	@BeforeTest
	public void beforeTest() {

	}

	@AfterTest
	public void afterTest() {

	}
}

  

 页面嵌套对象

使用页面嵌套对象,可以简化测试用例的步骤。

a、打开百度页面

b、输入“selenium关键字”
c、在搜索结果页面的搜索框中检查输入的文本是不是“selenium”
BaiDuPage.java :存储页面元素,相关操作以及嵌套ResultPage对象
ResultPage.java : 存储页面元素以及相关操作
BaiDuPageTest: 执行测试,检查结果

BaiDuPage.java

package page;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class BaiDuPage {

	// 定义百度搜索的输入框
	@FindBy(id = "kw")
	@CacheLookup
	private WebElement BD_INPUT_KEYWORD;

	// 定义百度搜索的搜索按钮
	@FindBy(id = "su")
	@CacheLookup
	private WebElement BD_BUTTON_SEARCH;

	private final String url = "https://baidu.com";
	private static WebDriver driver;

	// 提供一个外部获得driver的方法
	public static WebDriver getDriver() {
		return driver;
	}

	// 构造函数来初始化元素,即将元素映射到定义好的变量上

	public BaiDuPage() {
		driver = new FirefoxDriver();
		PageFactory.initElements(driver, this);
	}

	public void close() {
		driver.quit();
	}

	public void openUrl() {
		driver.get(url);
	}

	public ResultPage searchByKeyword(String keyword) {
		BD_INPUT_KEYWORD.sendKeys(keyword);
		BD_BUTTON_SEARCH.click();
		return new ResultPage();
	}
}

  ResultPage.java

package page;

import junit.framework.Assert;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class ResultPage {

	// 定义百度搜索结果界面的输入框
	@FindBy(id = "kw")
	@CacheLookup
	private WebElement RP_INPUT_KEYWORD;

	public ResultPage() {
		PageFactory.initElements(BaiDuPage.getDriver(), this);
	}

	public void checkKeyword() {
		Assert.assertEquals(RP_INPUT_KEYWORD.getAttribute("value"), "selenium");
	}
}

  BaiDuPageTest.java

package test;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import page.BaiDuPage;

public class BaiDuPageTest {

	@Test
	public void searchTest() {
		BaiDuPage baidupage = new BaiDuPage();
		baidupage.openUrl();
		baidupage.searchByKeyword("selenium").checkKeyword();
		baidupage.close();
	}

	@BeforeTest
	public void beforeTest() {

	}

	@AfterTest
	public void afterTest() {

	}
}

  

posted @ 2015-12-26 15:10  lucky_zhang  阅读(1019)  评论(0编辑  收藏  举报