在之前的文章中有提到,在頁面上抓取某個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:
Post a Comment