Selenium Webdriver и Type конструкторы, использующие Generics - Как это сделать
Каков наилучший способ использования дизайна PageFactory с веб-драйвером selenium 2, но когда страница не всегда загружает ожидаемую страницу, как я могу создать новую неожиданную страницу?
public class PassengerPage
{
[FindsBy(How = How.Id, Using "submitId")
IWebElement submitButton { get; set; }
private readonly IWebDriver driver;
public PassengerPage(IWebdriver driver)
{
if(!driver.url.Contains"Passengers.aspx")
{
throw new NotFoundException("Not the passenger page");
}
this.driver = driver;
PageFactory.InitElements(driver, this);
}
public PassengerPage NewPassenger(Passenger p)
{
// fill out some forms
// Example:
// someInputField.sendKeys(p.Name);
submitButton.Click(); // Ok, submit clicked, possibility of passenger page
// not coming back, depending on how many passengers were filled out
// But what if its not...
return new PassengerPage(driver);
}
}
// Что делать, если страница, которая возвращается после submitButton.Click(); такое страница Confirmation.aspx? Я не могу быть уверен на 100%, это зависит от предыдущих требований, таких как вход в систему, а затем указание, сколько пассажиров требуется, но это не сохраняется на этой странице.
Могу ли я использовать какой-нибудь конструктор типа?
Так что я мог сделать что-то вроде следующего:
public class PassengerPage
{
[FindsBy(How = How.Id, Using "submitId")
IWebElement submitButton { get; set; }
private readonly IWebDriver driver;
public PassengerPage(IWebdriver driver)
{
if(!driver.url.Contains"Passengers.aspx")
{
throw new NotFoundException("Not the passenger page");
}
this.driver = driver;
PageFactory.InitElements(driver, this);
}
public Page<T> NewPassenger(Passenger p)
{
// fill out some forms
// Example:
// someInputField.sendKeys(p.Name);
submitButton.Click(); // Ok, submit clicked, possibility of passenger page
// not coming back, depending on how many passengers were filled out
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(d => d.url.Contains("Passenger.aspx") || d => d.url.Contains("Confirmation.aspx");
if(driver.Url.Contains("Passenger.aspx")
{
return Page.Create<PassengerPage>(driver);
}
if(driver.Url.Contains("Confirmation.aspx")
{
return Page.Create<ConfirmationPage>(driver);
}
}
}
В другом классе я мог бы использовать что-то вроде этого? Я никогда не использовал Generics, подобный этому, и я думал об использовании чего-то вроде Java Class.forName(name);
// Some kind of Type Constructor
public class Page
{
public static T Create<T>(IWebDriver driver) where T : new()
{
return new T(driver);
}
}
Главное, что меня беспокоит, так это то, что я не смогу объединить свои функции в свои модульные тесты, как показано ниже:
[Test(Description = "Some description about my unit test")
public void TestAddPassengerAndConfirm()
{
new LoginPage(driver).Login("username", "password")
.NavigateToSearch()
.Search( /* input search criteria */ )
.SelectSearchResult(Result.First)
.AddPassenger(new Passenger()
{
FirstName = "first",
LastName = "last",
})
.AddPassenger(new Passenger()
{
// More properties
})
.ConfirmPassengers() // This would be a function on my ConfirmationPage
// That would return the HomePage or something
}
Любые рекомендации о том, как мне это сделать?
1 ответ
Вам придется разбить эту цепочку методов на несколько операторов. В C# я бы сделал что-то вроде следующего. Это не так красиво (если вы верите в цепочку методов), и это не так просто, но если бы программирование было простым, нам бы не заплатили за это.
public void TestAddPassengerAndConfirm()
{
Page uncertainPage = new LoginPage(driver).Login("username", "password")
.NavigateToSearch()
.Search( /* input search criteria */ )
.SelectSearchResult(Result.First);
if (uncertainPage is PassengerPage)
{
PassengerPage passengerPage = (PassengerPage) uncertainPage;
uncertainPage = passengerpage.AddPassenger(new Passenger()
{
FirstName = "first",
LastName = "last",
})
.AddPassenger(new Passenger()
{
// More properties
});
}
if (uncertainPage is ConfirmationPage)
{
ConfirmationPage confirmationPage = (ConfirmationPage) uncertainPage;
confirmationPage.ConfirmPassengers();
}
}