java - 使用泛型的 Selenium Webdriver 和类型构造函数 - 如何操作

标签 java generics webdriver selenium-webdriver dynamic-class-creation

将 PageFactory 设计与 selenium 2 webdriver 结合使用的最佳方法是什么,但是当页面并不总是加载预期页面时,如何创建新的意外页面?

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

      }
}

在另一个类(class)中我可以使用这样的东西吗?我从来没有像这样使用过泛型,而且我是 考虑使用类似 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

}

关于我应该如何执行此操作有什么建议吗?

最佳答案

您必须将该方法链拆分为多个语句。在 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();
    }
}

关于java - 使用泛型的 Selenium Webdriver 和类型构造函数 - 如何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210565/

相关文章:

java - 如何编译一个任意命名与公共(public)类名不同的.java文件

java - 如何定义通用参数 Class[] 并在restTemplateBuilder.getForObject() 上使用它?

selenium - 如何使用 Selenium WebDriver 获取图像 src 名称

java - 如何让网络驱动程序在元素可点击时立即点击该元素,而不是加载整个页面?

java - 如何在偶数索引和奇数索引上创建具有反转元素的新数组

java - 连接池的工作原理

c# - 为什么这个通用转换失败

java - 编写一个名为 Child 的简单接口(interface)(其中没有任何内容),并使用它创建一个只能存储 Boy 和 Girl 实例的 ArrayList

java - Selenium WebDriver 循环不工作

java - Eclipse 以退出值 0 终止