2013-04-24 51 views
4

我一直在使用Selenium WebDriver爲我一起工作的一些項目實現功能測試。我試圖在Page Factory中使用Page Object設計模式來分解我的定位器。我還創建了一個靜態的WaitTool對象(單例),它實現了幾個可選的超時參數的等待技術。在使用Java的Selenium WebDriver中使用PageObjects,Page Factory和WebDriverWait

我目前的問題是,我想在PageFactory嘗試初始化WebElement之前使用我的等待方法。我想等待的原因是因爲PageFactory可能會嘗試在頁面元素可用之前初始化頁面元素。

這裏是一個示例PageObject:

public class SignInPage extends PageBase { 
    @FindBy(id = "username") 
    @CacheLookup 
    private WebElement usernameField; 

    @FindBy(id = "password") 
    @CacheLookup 
    private WebElement passwordField; 

    @FindBy(name = "submit") 
    @CacheLookup 
    private WebElement signInButton; 

    public SignInPage(WebDriver driver) { 
     super(driver); 

     WaitTool.waitForPageToLoad(driver, this); 

     // I'd like initialisation to occur here 
    } 

    public MainPage signInWithValidCredentials(String username, String password){ 
     return signIn(username, password, MainPage.class); 
    } 

    private <T>T signIn(String username, String password, Class<T> expectedPage) { 
     usernameField.type(username); 
     passwordField.type(password); 
     signInButton.click(); 

     return PageFactory.initElements(driver, expectedPage); 
    } 
} 

下面是一個簡單的TestObject:

public class SignInTest extends TestBase { 
    @Test 
    public void SignInWithValidCredentialsTest() { 
     SignInPage signInPage = PageFactory.initElements(driver, SignInPage.class); 

     MainPage mainPage = signInPage.signInWithValidCredentials("sbrown", "sbrown"); 

     assertThat(mainPage.getTitle(), is(equalTo(driver.getTitle()))); 
    } 
} 

我傾向於把我的邏輯在Page對象儘可能多地(包括等待),如它使測試案例更具可讀性。

回答

7

PageFactroy中的WebElements實際上是WebElements的代理。這意味着每次訪問WebElement時,都會執行搜索以查找頁面上的元素。

這有一定的優勢:

  • 當PageFactory被初始化的代理配置,但WebElements沒有在這一點上找到(所以你不會得到一個NoSuchElementException)
  • 每次使用WebElement它會去找到它,所以你不應該SE StaleElementException的

您正在使用@CacheLookup註釋這是失去你的第二個好處,因爲它會一旦找到元素,然後保持一個參考它,你現在更有可能看到StaleElementExceptions。

這就是說,你仍然保持的主要好處是,硒不會去頁面,直到你第一次使用它,實際上找到元素。

因此,在總結所有你需要做的是移動

PageFactory.initElements(driver, this); 

進入你的構造,它都將正常工作。

+0

我想這意味着我不能在signIn函數中返回'PageFactory.initElements(driver,expectedPage)'。 – 2013-04-25 22:32:19

+0

'PageFactory.initElements(driver,this.class);'似乎不起作用。提供'this'或'this.getClass()'可行,但我不確定這是否正在做我想做的。 – 2013-04-25 22:38:51

+0

對不起,這是我的答案中的錯誤。我的意思就是這個(回答更新顯示正確的代碼片段) – Ardesco 2013-04-26 05:29:30

相關問題