C# .Net을 사용하여 Selenium 2 Web Driver를 사용하여 테스트를 만들고 있습니다. 많은 Selenium 문서를 읽은 후에도 PageObject 디자인 패턴을 사용하여 테스트하는 방법을 알지 못했습니다.Selenium PageObject 디자인 패턴을 사용하는 가장 좋은 방법은 무엇입니까?
많은 셀렌 예제가 Java로만 표시되며 .Net 용 API 바인딩은 제한 사항 및 특정 언어로 설정된 표준으로 인해 항상 그렇다고 볼 수있는 것과 항상 같은 것은 아닙니다.
.Net Selenium Web Driver의 PageFactory에서 PageObject 디자인 패턴을 사용하는 가장 좋은 방법은 무엇입니까?
결국 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과 함께 일을하고 무엇을 : 셀레늄 webdriver 디자인 패턴에 대한 내가 찾은 기사와 블로그 게시물의 대부분
[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);
}
}
내가 찾을 이전 게시물 모순을 제공합니다.
그럼 올바른 방법은 무엇입니까?
이 문제를 해결하기 위해 PageObject 디자인 패턴을 사용해 보았습니다.
[Test]
[Description("Login using PageObject Design Pattern")]
public void Login()
{
loginPage = new LoginPage(driver);
HomePage signIn = loginPage.SignIn("pattest", "pattest");
}
내 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' (드롭 다운 목록)이면 어떻게 될까요? 내가 select (dropdownlist)에 대한 pageobject를 사용할 수 없다는 말은 사실입니까? –
누군가가 @Nick Kahn의 질문에 답할 수 있습니까 :) 나는 똑같은 문제를 겪고 있습니다. –