April 20, 2014

以Page Factory撰寫Selenium測試程式

Page Factory是Selenium提供的另一個library,用來輔助以Page Object Pattern所撰寫的測試程式。要使用這個library,可以透過nuget指令Install-Package Selenium.Support安裝。

在之前的文章中有提到,在頁面上抓取某個HTML物件,可以透過以下方式
IWebElement userNameField = this._driver.FindElement(By.Id("UserName"));

以Page Factory的方式來撰寫的話,則改為宣告私有變數加上annotation方式取得頁面上物件,如
[FindsBy(How = How.Id, Using = "UserName")]
private IWebElement _usernameField;

並在建構式中初始化整個page類別
public RegisterPageUsingPageFactory(IWebDriver driver)
{
    this._driver = driver;
    PageFactory.InitElements(driver, this);
}
接下來前述宣告的私有變數即可使用,如
public RegisterPageUsingPageFactory EnterUsername(string username)
{
    this._username = username;
    this._usernameField.SendKeys(username);
    return this;
}

以page factory加annotation的方式撰寫程式,是不是優雅且程式碼乾淨許多?以下為以page factory改寫過後的page物件。


從以上的例子也許還看不出page factory撰寫方式的優點,但隨著HTML物件的重覆使用率變高,就越能顯示出page factory的好處。但有一點需要注意的是,由於宣告的私有變數是在run time時才由PageFactory類別初始化,所以在compile time時Visual Studio就會出現警告訊息。


若要移除警告訊息,可加入#pragma warning指示詞,如
#pragma warning disable 649

        [FindsBy(How = How.Id, Using = "UserName")]
        private IWebElement _usernameField;

        [FindsBy(How = How.Id, Using = "Password")]
        private IWebElement _passwordField;

        [FindsBy(How = How.Id, Using = "ConfirmPassword")]
        private IWebElement _confirmPassword;

        [FindsBy(How = How.ClassName, Using = "btn")]
        private IWebElement _registerButton;

        [FindsBy(How = How.XPath, Using = "//div[@class='validation-summary-errors']/ul/li")]
        private IList<IWebElement> _errorMessages;

#pragma warning restore 649


完整程式碼可由https://github.com/petekcchen/blog/tree/master/SeleniumDemo下載


參考

No comments: