Sto creando test utilizzando Selenium 2 Web Driver con C# .Net. Dopo aver letto tutta la documentazione Selenium, mi sento ancora incerto su come testare utilizzando i pattern di progettazione PageObject.Qual è il modo migliore per utilizzare Selenium PageObject Design Pattern
Molti degli esempi di selenio vengono visualizzati solo in Java e le associazioni API per .Net non sono sempre così simili come si potrebbe pensare che siano dovute a limitazioni e agli standard impostati da alcune lingue.
Qual è il modo migliore per utilizzare il pattern di progettazione PageObject con PageFactory in .Net Selenium Web Driver?
Eventualmente, desidero che il mio PageObjects gestisca più funzionalità, piuttosto che i miei test NUnit che utilizzano PageObject IWebElements.
Di seguito è riportato un esempio di come sto attualmente andando a creare i miei test andando avanti.
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;
}
}
Al momento questo è quello che sto facendo attualmente con 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);
}
}
La maggior parte degli articoli e post di blog che ho trovato per il selenio WebDriver Design Patterns emanano contraddizioni a post precedenti trovo.
Quindi, qual è la strada giusta?
Per finire, ho persino provato il pattern di progettazione PageObject.
[Test]
[Description("Login using PageObject Design Pattern")]
public void Login()
{
loginPage = new LoginPage(driver);
HomePage signIn = loginPage.SignIn("pattest", "pattest");
}
Dentro il mio 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);
}
E, naturalmente per mostrare come la mia home page deve essere iniziata con il suo costruttore:
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);
}
Come si usa WebDriver PageObject modello di progettazione in modo efficace con test. Non riesco a capirlo.
Sì, questa è la struttura alla quale sono finito quando ho avviato il progetto. +1 –
domanda, come faresti se l'elemento è 'Select' (dropdownlist) in pageobject? mi è stato detto che non è possibile utilizzare pageobject per select (dropdownlist) è vero? –
Qualcuno può rispondere alla domanda di @Nick Kahn per favore :) Sto avendo lo stesso problema. –