为什么要在页面对象类

时间:2018-08-29 09:40:40

标签: selenium-webdriver pageobjects page-factory

我正在研究页面对象框架的概念时,我知道页面工厂(@FindBy)与页面对象结合使用。 但是,我无法理解为什么可以在页面对象类的定位器中使用driver.findElement时使用@FindBy。例如:

//带有@FindBy的代码

  public class LoginPage{

      public LoginPage(WebDriver driver)){
      PageFactory.initElements(driver,this);
     }

     public WebElement q;

    }

    public class TestCase{

WebDriver driver=new FirefoxDriver();
LoginPage logPage=new LoginPage(driver);

 public void enterUserName(){
   logPage.q.sendKeys("username");

}
}

//带有driver.findElement的代码

public class LoginPage{

 public WebElement q=driver.findElement(By.id('q'));

}

public class TestCase{
WebDriver driver=new FirefoxDriver();
 LoginPage logPage=new LoginPage();

 public void enterUsername(){
  logPage.q.sendKeys("username");
}

}

这两个代码本质上是在做同一件事,所以这两个代码之间有什么区别?

1 个答案:

答案 0 :(得分:0)

从根本上来说,无论您使用的是Driver.FindElement()还是@FindBy批注,测试的运行方式以及驱动程序的工作方式都没有太大差异。在我看来,使用@FindBy的“好处”是它指导您将与特定页面相关的所有WebElements和Method保持在一个位置,并且将页面元素的查找与所携带的方法分开在页面上,例如参见下面的简短示例登录页面(在C#中):

public class LoginPage
{
    public IWebDriver Driver;

    [FindsBy(How = How.Id, Using = "username")]
    public IWebElement UsernameField;

    [FindsBy(How = How.Id, Using = "password")]
    public IWebElement PasswordField;

    [FindsBy(How = How.Id, Using = "submit")]
    public IWebElement SubmitButton;

    public LoginPage(IWebDriver driver)
    {
        Driver = driver;
        PageFactory.InitElements(this, new RetryingElementLocator(Driver, TimeSpan.FromSeconds(10)));
    }

    // By this point, all your elements on the page are declared and located,
    // you're now free to carry out whatever operations you'd like on the page 
    // without having to make any further declarations

    public void Login(string username, string password)
    {
        UsernameField.SendKeys(username);
        PasswordField.SendKeys(password);
        SubmitButton.Click();
    }
}

因此,我想说这主要是偏爱,但同时也会争论说,@ FindBy注释带来的“整洁” /组织有一些令人信服的论点。