粗略地讲,
@FindBy这只是查找元素的另一种方式(
driver.findElement()如您所说,“通常的方式” )。
但是,该注释的最大优势不是它本身。最好用于支持
PageObject模式 。
简而言之, PageObject 模式告诉您为要使用/测试 的系统的每个页面创建一个类 。
因此,与其拥有(通常的
driver.findElement()代码):
public class TestClass { public void testSearch() { WebDriver driver = new HtmlUnitDriver(); driver.get("http://www.google.com/"); Element searchBox = driver.findElement(By.name("q")); searchBox.sendKeys("stringToSearch"); searchBox.submit(); // some assertions here }}您将为页面定义一个类(使用
@FindBy的元素带有注释):
public class GooglePage { @FindBy(how = How.NAME, using = "q") private WebElement searchBox; public void searchFor(String text) { searchBox.sendKeys(text); searchBox.submit(); }}并像这样使用它:
public class TestClass { public void testSearch() { WebDriver driver = new HtmlUnitDriver(); driver.get("http://www.google.com/"); GooglePage page = PageFactory.initElements(driver, GooglePage.class); page.searchFor("stringToSearch"); // some assertions here }}现在,我知道这乍看起来似乎很冗长,但请稍等一下,考虑为该页面准备 几个测试用例 。如果
searchBox更改名称怎么办?(从
name
"q"到
id,说
query吗?)
在什么代码中会有更多更改才能使它再次运行?一个有或没有页面对象(和
@FindBy)的对象?如果页面的结构发生了很大变化,使用哪种代码进行维护会更容易?
还有其他一些优点,例如像这样的附加注释:
@FindBy(name = "q")@CacheLookupprivate WebElement searchBox;
这
@CacheLookup使得该元素的查找仅发生一次。之后,它将被缓存在变量中,并且访问速度更快。
希望这可以帮助。有关更多详细信息,请确保检查
PageFactory 和
PageObject模式 。



