1.目的:为了将元素的find方法和业务逻辑分开来。如果元素的页面位置发生了变化,只需改动一个文件,而不影响业务的实现。
2.原理:一般一个页面对应一个class,在class里描述所有要用到的webelement。通过PageFactory.initWebElement(Webdriver d,this)的方法来实例化页面对象。
每次在用到一个元素的时候,会在当前页面搜索,如果第二次再用到这个元素,则会再次寻找。如果一个元素在页面的任何地方都不会变,则可以再@FindBy方法的下方写上@CacheLookup,则会被缓存起来,这样可以提高搜索效率
3.例子:登录163邮箱,在163的写信页面,先点击写信按钮,然后在收件人里填写对应信息
//【1】元素类---登录页面
public class Login163VO {
@FindBy(id="idInput")
public
WebElement username ;
@FindBy(id="pwdInput")
public
WebElement password ;
@FindBy(id="loginBtn")
public
WebElement loginBtn ;
public Login163VO(WebDriver
driver){
PageFactory.initElements(driver,this);
}
}
//【2】元素类---写信页面
public class Send163VO {
//通过xpath方法,找到写信按钮
@FindBy(xpath="//div[@id=‘dvNavTop‘]/ul/li[2]")
//把该按钮缓存起来
@CacheLookup
public WebElement xiexin ;
//通过xpath方法,找到收件人输入框。这个按钮是点击写信按钮后才显示的。但是使用PageObject方法不受影响,因为在使用到该元素时,才会去搜索,并且调用该元素,是在点击了写信按钮以后
@FindBy(xpath="//div[@id=‘divComposeto‘]/div/div/div[2]/div/input")
public
WebElement shoujianren;
//使用PageObject方法,实例化页面元素
public
Send163VO(WebDriver driver){
PageFactory.initElements(driver,
this);
}
}
//【3】测试类--使用了testng
public class Test163 {
WebDriver driver =
null;
Login163VO t = null;
Send163VO s =
null;
@BeforeClass
public void
setUp(){
driver= new
FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30,
TimeUnit.SECONDS);
driver.get("http://mail.163.com");
}
@Test
public void testLogin163() throws
InterruptedException {
t = new
Login163VO(driver);
t.username.sendKeys("name@163.com");
t.password.sendKeys("pass");
t.loginBtn.click();
Thread.sleep(3000);
}
@Test
public void
testXiexin163(){
s = new
Send163VO(driver);
s.xiexin.click();
s.shoujianren.sendKeys("name@126.com");
}
@Test(enabled=false)//不会执行的类,暂时没有实现好的类
public
void tearDown(){
driver.quit();
}
}
原文:http://www.cnblogs.com/Jourly/p/3699203.html