最近研究了下Webdriver PageObject模式,现在分享出来。PageObject模式的思想就不多讲了,直入正题哈。WebDriver为了支持PageObject模式,支持库包含一个叫PageFactory的工厂类。为了使用PageFactory,首先必须声明一个PageObject的一些字段,如:WebElements或List

For example: 

   
   
   
   
  1. public class BaiduIndexPage { 
  2.     private WebElement kw; 
  3.     public void searchFor(String term) { 
  4.         // 实现百度搜索功能 
  5.         kw.clear(); 
  6.         kw.sendKeys(term); 
  7.         kw.submit(); 
  8.     } 

为了使此代码可以运行并且不因为kw字段没有实例化而抛出NullPointerException,我们需要实例化该PageObject

   
   
   
   
  1. public class SearchTest{ 
  2.     public static void main(String[] args) { 
  3.         WebDriver driver = new FirefoxDriver(); 
  4.         driver.get("http://www.baidu.com/"); 
  5.         BaiduIndexPage page = PageFactory.initElements(driver, BaiduIndexPage.class); 
  6.         page.searchFor("踏歌"); 
  7.     } 
  8. }  

PageFactory依赖于使用合理的默认值,Java类的字段被认为是HTML页面的元素。也就是说相当于driver.findElement。这样每当我们在一个方法里面调用WebElement,driver就会到当前页面寻找该元素。

驱动实例使用的是传递到PageFactory的initElements方法。在我们所说的例子中,我们依赖PageFactory实例化PageObject的实例。

   
   
   
   
  1. PageFactory.initElements(driver, page); 

为了增加代码的可读性,我们还可以使用注释,选择一个有意义的名称来定义我们的元素

   
   
   
   
  1. @FindBy(id = "kw"
  2. private WebElement searchField; 

我们可以通过@FindBy或@FindBys注释来修饰我们的字段

当一个元素的属性存在重复,我们也可以使用多个不同属性进行定义。

BaiduIndexPage.java

   
   
   
   
  1. public class BaiduIndexPage { 
  2.     private WebDriver driver; 
  3.     private final String url = "http://www.baidu.com"
  4.  
  5.     public BaiduIndexPage(WebDriver driver) { 
  6.         this.driver = driver; 
  7.         driver.get(url); 
  8.         PageFactory.initElements(driver, this); 
  9.     } 
  10.  
  11.     @FindBy(id = "kw"
  12.     private WebElement searchField; 
  13.  
  14.     @FindBy(id = "su"
  15.     private WebElement baidSearchButton; 
  16.  
  17.     public void searchFor(String term) { 
  18.         searchField.clear(); 
  19.         searchField.sendKeys(term); 
  20.         searchField.submit(); 
  21.     } 
  22. }

testcase方法

   
   
   
   
  1. @Test 
  2. public void searchTest() { 
  3.     BaiduIndexPage baidu=new BaiduIndexPage(driver); 
  4.     baidu.searchFor("踏歌");  

OK先到这,有后续研究再做分享。