Was ist der beste Weg, Selenium PageObject Design Pattern zu verwenden?
Ich bin erstellen von tests mit Selenium 2 Web-Treiber mit C#.Net. Nach dem Lesen durch eine Menge von Selen-Dokumentation, habe ich immer noch das Gefühl unsicher, wie man über das testen mit dem PageObject-design-patterns.
Viele Selen-Beispiele sind nur in Java und der API-bindings für .Net sind nicht immer so ähnlich, als würde man denken, Sie sind aufgrund von Einschränkungen und standards festgelegt, die von bestimmten Sprachen.
Was ist der beste Weg, um die PageObject-design-Muster mit PageFactory .Net-Selenium Web Driver?
Schließlich möchte ich, dass mein PageObjects mehr Funktionalität, anstatt meine NUnit-tests mit dem PageObject IWebElements.
Unten ist ein Beispiel, wie ich mich derzeit um meine tests voran.
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;
}
}
Im moment das ist, was ich bin derzeit dabei mit 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);
}
}
Meisten der Artikel und blog-posts finde ich für selenium webdriver Design Patterns geben Widersprüche zu vorherigen posts finde ich.
Also, was ist der richtige Weg?
Top dieses Weg, ich hatte sogar das PageObject-design-Muster zu versuchen.
[Test]
[Description("Login using PageObject Design Pattern")]
public void Login()
{
loginPage = new LoginPage(driver);
HomePage signIn = loginPage.SignIn("pattest", "pattest");
}
In meinem 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);
}
Und natürlich um zu zeigen, wie meine HomePage sollte begonnen werden, mit den zugehörigen Konstruktor:
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);
}
Wie verwende ich WebDriver PageObject-design-Muster, das effektiv testen kann.
Ich kann nicht dieses heraus.
InformationsquelleAutor der Frage Patrick Magee | 2011-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
PageFactory.InitElements(_driver, this)
; auf der Konstruktor der base Klasse Seite:Finden Sie die PageFactory-Dokumentation
InformationsquelleAutor der Antwort Boler
Ich würde vermeiden, dass die Bestätigungen in den Prüfungen und den stick mit der LoginPage.signIn-Methode, die eine Ausnahme im Falle der erfolglosen login -. Ich bin nicht vertraut mit NUnit, aber ich denke, es unterstützt die " voraussichtliche-to-fail-Verhalten.
Ist es besser, halten Sie Ihre Seite-abhängigen Logik in einem Ort(die page-Klasse).
Ich denke, Sie werden ändern müssen, um die web-UI-tests, eine Menge wie die Haupt-app entwickelt sich sowieso.
InformationsquelleAutor der Antwort Bond
Erstellen Sie ein Browser-Klasse zum erstellen von Treiber-und ähnliche Funktionen wie GoTo() für die navigation und Teardown() für den browser zu schließen.`
Erstellen Sie individuelle Klassen für Seiten und verwenden PageFactory zu initailize der Elemente.
Es ist ein kleines Beispiel mit einem login-Funktionalität.
Ich hoffe, dass dies helfen könnte, auch wenn eine späte Antwort.
InformationsquelleAutor der Antwort user3687440