Selenium Webdriver и Type конструкторы, использующие Generics - Как это сделать - PullRequest
0 голосов
/ 21 ноября 2011

Как лучше всего использовать дизайн 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 Ответ

1 голос
/ 22 ноября 2011

Вам придется разбить эту цепочку методов на несколько операторов.В 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...