PageFactory是为了支持页面设计模式而开发出来的,它的方法在selenium.support库里面。
PageFactory它提供初始化页面元素的方法,如果页面存在大量的AJAX的技术,只要页面更新一次,它就好重新查找一次元素,所以不会出现StaleElementException这个error,
如果你不想要它每次都更新,你可以加上@CacheLookup.
页面设计模式,可以提供你一个接口,然后你在这个接口上面,构建你自己项目中的页面对象,使用PageFactory使得测试更简单,更少的代码编写。
如果@FindBy没有指定,它会默认的查找id的属性,然后是name属性,如果还没有找到就会报错。 如果这个元素存在,我们不用担心它, pageFactory会初始化这个元素,不会报任何错误。
先看个列子:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class BaiduSearchPage {
WebDriver driver;
@FindBy(id = "kw")
@CacheLookup
WebElement searchField;
@FindBy(id = "su")
@CacheLookup
WebElement searchButton;
public BaiduSearchPage(WebDriver driver){
this.driver = driver;
PageFactory.initElements(driver,this);
}
public void inputText(String search){
searchField.sendKeys(search);
}
public void clickButton(){
searchButton.click();
}
}
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Test {
public static void main(String[] args) {
BaiduSearchPage searchPage;
WebDriver driver =new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.baidu.com");
searchPage =new BaiduSearchPage(driver);
searchPage.inputText("selenium");
searchPage.clickButton();
}
}
我们平时写查找元素,喜欢倾向于driver.findElement(by)这种方法,但是有的时候我们需要考虑查找失败,或者AJAX的情况,但是pageFactory就不需要,这使得查找页面元素更简单,快速。
基于页面设计对象, 我们可以编写更少的代码去完成更多的测试案例。