淺析selenium的PageFactory模式
1.首先介紹FindBy類:
For example, these two annotations point to the same element:
@FindBy(id = "foobar") WebElement foobar;
@FindBy(how = How.ID, using = "foobar") WebElement foobar;
and these two annotations point to the same list of elements:
@FindBy(tagName = "a") List<WebElement> links; @FindBy(how= How.TAG_NAME, using = "a") List<WebElement> links;
用來分別查找單個元素和多個元素的兩種用法,支持的類型有:className、
css、
id、
linkText、
name、
partialLinkText、
tagName、
xpath。
How支持的類型和上面差不多。
2.接著介紹PageFactory類
Factory class to make using Page Objects simpler and easier.
它提供的方法都是靜態的,可以直接調用,我們在用完findby後,需要進行元素初始化,則需要調用下面的方法
initElements(ElementLocatorFactory factory, java.lang.Object page)、initElements(FieldDecorator decorator, java.lang.Object page)、initElements(WebDriver driver, java.lang.Class<T> pageClassToProxy)、initElements(WebDriver driver, java.lang.Object page)
我們在實際使用中可以這樣用:
PageFactory.initElements(dr, XXX.class);
或者
PageFactory.initElements(new AjaxElementLocatorFactory(dr, 10) ,XXX.class);
後者加入了初始化元素時等待時間。
PageFactory是為了支持頁面設計模式而開發出來的,它的方法在selenium.support庫裏面。
PageFactory它提供初始化頁面元素的方法,如果頁面存在大量的AJAX的技術,只要頁面更新一次,它就好重新查找一次元素,所以不會出現StaleElementException這個error,
如果你不想要它每次都更新,你可以加上@CacheLookup.
頁面設計模式,可以提供你一個接口,然後你在這個接口上面,構建你自己項目中的頁面對象,使用PageFactory使得測試更簡單,更少的代碼編寫。
[email protected],它會默認的查找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; [email protected](id = "kw") [email protected] WebElement searchField; [email protected](id = "su") [email protected] 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就不需要,這使得查找頁面元素更簡單,快速。
基於頁面設計對象, 我們可以編寫更少的代碼去完成更多的測試案例。
淺析selenium的PageFactory模式