我正在研究页面对象框架的概念时,我知道页面工厂(@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");
}
}
这两个代码本质上是在做同一件事,所以这两个代码之间有什么区别?
答案 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注释带来的“整洁” /组织有一些令人信服的论点。