0

Selenium 2 webdriver で PageFactory デザインを使用する最良の方法は何ですか?しかし、ページが常に期待されるページをロードするとは限らない場合、新しい予期しないページを作成するにはどうすればよいですか?

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(); の後に返されたページが .aspx ページですか? 100% 確信は持てません。サインインや必要な乗客数などの以前の要件によって異なりますが、これはこのページには保存されません。

ある種の Type コンストラクターを使用できますか?

だから私は次のようなことをすることができます:

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);
          }

      }
}

別のクラスで、このようなものを使用できますか? 私はジェネリックをそのように使用したことがなく、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

}

これを行う方法に関する推奨事項はありますか?

4

1 に答える 1

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();
    }
}
于 2011-11-22T15:07:46.607 に答える