我使用Selenium 2 Web Driver與C#.Net創建測試。在閱讀了很多Selenium文檔後,我仍然不確定如何使用PageObject設計模式進行測試。什麼是使用Selenium PageObject設計模式的最佳方式
許多selenium示例僅在Java中顯示,.Net的API綁定並非總是如人們所認爲的那樣相似,這是由於某些語言設置的限制和標準。
在.Net Selenium Web驅動程序中使用PageObject設計模式和PageFactory的最佳方式是什麼?
最終,我希望我的PageObjects能夠處理更多的功能,而不是使用PageObject IWebElements的NUnit測試。
下面是我如何創建我的測試前進的示例。
public class LoginPage
{
private IWebDriver webDriver;
[FindsBy(How = How.Id, Using = "ctl00_ctl00_ctl00_insideForm_insideForm_content_txtPassword")]
public IWebElement Password { get; set; }
[FindsBy(How = How.Id, Using = "ctl00_ctl00_ctl00_insideForm_insideForm_content_cmdSubmit")]
public IWebElement SubmitButton { get; set; }
[FindsBy(How = How.Id, Using = "ctl00_ctl00_ctl00_insideForm_insideForm_content_txtUserName")]
public IWebElement UserName { get; set; }
public LoginPage() { }
public LoginPage(IWebDriver webDriver)
{
this.webDriver = webDriver;
if(!webDriver.Url.Contains("Login.aspx"))
{
throw new StaleElementReferenceException("This is not the login page");
}
PageFactory.InitElements(webDriver, this);
}
public HomePage signIn(string username, string password)
{
UserName.SendKeys(username);
Password.SendKeys(password);
SubmitButton.Submit();
// Even if i create a NUnit test for this
// Issue with page loading still occures when I try and return new object
HomePage homePage = new HomePage(webDriver);
PageFactory.InitElements(webDriver, homePage);
return homePage;
}
}
目前,這是我目前正在與NUnit的做:
[TestFixture]
public class LoginPageTest : TestBase
{
private IWebDriver driver;
private LoginPage loginPage;
private HomePage homePage;
[SetUp]
[Description("Sets up the test fixture page objects and navigates to the login page.")]
public void SetUp()
{
driver = StartDriver();
Log.Info("Driver started");
driver.Navigate().GoToUrl("http://" + Environment + ");
loginPage = new LoginPage();
PageFactory.InitElements(driver, loginPage);
//driver.Navigate().Refresh();
}
[Test]
[Description("Enters invalid credentials and asserts that a correct error message is displayed.")]
public void SubmitFormInvalidCredentials()
{
loginPage.UserName.SendKeys("invalid");
loginPage.Password.SendKeys("invalid");
loginPage.SubmitButton.Click();
IWebElement invalidCredentials = driver.FindElement(By.Id("ctl00_ctl00_ctl00_insideForm_insideForm_ctl02_title"));
Assert.AreEqual("Invalid user name or password", invalidCredentials.Text);
}
[Test]
[Description("Enters valid credentials and asserts that the user is taken to the home page.")]
public void SubmitFormValidCredentials()
{
loginPage.UserName.SendKeys("valid");
loginPage.Password.SendKeys("valid");
loginPage.SubmitButton.Click();
homePage = new HomePage();
PageFactory.InitElements(driver, homePage);
Assert.AreEqual("pattest", homePage.Username.Text);
}
}
大部分文章和博客帖子中,我發現了硒的webdriver設計模式發出矛盾,以前的文章,我覺得。
那麼,什麼是正確的方式?
爲了解決這個問題,我甚至給了PageObject設計模式一個嘗試。
裏面我LoginPage
public LoginPage(IWebDriver driver)
{
this.driver = driver;
if (!driver.Url.Contains("Login.aspx"))
{
throw new ElementNotFoundException("This is not the login page");
}
PageFactory.InitElements(driver, this);
}
public HomePage SignIn(string username, string password)
{
UserName.SendKeys(username);
Password.SendKeys(password);
SubmitButton.Click();
return new HomePage(driver);
}
,當然以顯示如何我的主頁應該有它的構造函數初始化:
public HomePage(IWebDriver d)
{
webDriver = d;
// I need to use this as its not freaking waiting for my Page to load when I pass the webdriver in the consturctor.
var wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(60));
try
{
wait.Until(driver => driver.FindElement(By.Id("ctl00_ctl00_ctl00_insideForm_insideForm_loginStatus")));
}
catch(Exception e)
{
throw new ElementNotFoundException("This is not the home page.");
}
PageFactory.InitElements(webDriver, this);
}
如何使用webdriver的PageObject設計模式有效地測試。 我無法弄清楚這一點。
是的,這是我在開始項目時結束的結構。 +1 –
問題,如果元素是pageobject中的「Select」(dropdownlist),你會怎麼做?我被告知,你不能使用pageobject進行選擇(dropdownlist)是真的嗎? –
有人可以回答@尼克卡恩的問題:)我有同樣的問題。 –