最近研究了下Webdriver PageObject模式,现在分享出来。PageObject模式的思想就不多讲了,直入正题哈。WebDriver为了支持PageObject模式,支持库包含一个叫PageFactory的工厂类。为了使用PageFactory,首先必须声明一个PageObject的一些字段,如:WebElements或List<webelement>等
For example:
- public class BaiduIndexPage {
- private WebElement kw;
- public void searchFor(String term) {
- // 实现百度搜索功能
- kw.clear();
- kw.sendKeys(term);
- kw.submit();
- }
- }
为了使此代码可以运行并且不因为kw字段没有实例化而抛出NullPointerException,我们需要实例化该PageObject
- public class SearchTest{
- public static void main(String[] args) {
- WebDriver driver = new FirefoxDriver();
- driver.get("http://www.baidu.com/");
- BaiduIndexPage page = PageFactory.initElements(driver, BaiduIndexPage.class);
- page.searchFor("踏歌");
- }
- }
PageFactory依赖于使用合理的默认值,Java类的字段被认为是HTML页面的元素。也就是说相当于driver.findElement。这样每当我们在一个方法里面调用WebElement,driver就会到当前页面寻找该元素。
驱动实例使用的是传递到PageFactory的initElements方法。在我们所说的例子中,我们依赖PageFactory实例化PageObject的实例。
- PageFactory.initElements(driver, page);
为了增加代码的可读性,我们还可以使用注释,选择一个有意义的名称来定义我们的元素
- @FindBy(id = "kw")
- private WebElement searchField;
我们可以通过@FindBy或@FindBys注释来修饰我们的字段
当一个元素的属性存在重复,我们也可以使用多个不同属性进行定义。
BaiduIndexPage.java
- public class BaiduIndexPage {
- private WebDriver driver;
- private final String url = "http://www.baidu.com";
- public BaiduIndexPage(WebDriver driver) {
- this.driver = driver;
- driver.get(url);
- PageFactory.initElements(driver, this);
- }
- @FindBy(id = "kw")
- private WebElement searchField;
- @FindBy(id = "su")
- private WebElement baidSearchButton;
- public void searchFor(String term) {
- searchField.clear();
- searchField.sendKeys(term);
- searchField.submit();
- }
- }
testcase方法
- @Test
- public void searchTest() {
- BaiduIndexPage baidu=new BaiduIndexPage(driver);
- baidu.searchFor("踏歌");
- }
OK先到这,有后续研究再做分享。