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就不需要,這使得查找頁面元素更簡單,快速。
基於頁面設計對象, 我們可以編寫更少的代碼去完成更多的測試案例。