0

我正在创建一个页面对象框架,同时了解它的概念,我知道页面工厂(@FindBy)与页面对象结合使用。但是,当我可以在 Page Object 类中将 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");
}

}

这里的两个代码之间有什么区别,因为这两个代码基本上都在做同样的事情?

4

1 回答 1

0

从根本上说,无论您使用的是 Driver.FindElement() 还是 @FindBy 注释,在测试的运行方式和驱动程序正在做什么方面可能没有太大的区别。在我看来,使用@FindBy 的“好处”是它指导您将与特定页面相关的所有 WebElements 和方法保存在一个位置,并将页面元素的查找与您携带的方法分开在页面上,例如,请参见下面的简要示例登录页面(在 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 注释带来的“整洁”/组织,有一些令人信服的论据。

于 2018-08-29T14:21:45.150 回答