为什么要使用@FindByvs driver.findElement()?
@FindBy
driver.findElement()
@FindBy迫使我将所有变量都移到类级别(当大多数变量只需要在方法级别时)。似乎唯一可以买给我的东西是我可以打电话给我PageFactory.initElements(),它可以为我处理延迟初始化。
PageFactory.initElements()
我想念什么?
粗略地讲,@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吗?)
searchBox
name
"q"
id
query
在什么代码中会有更多更改才能使它再次运行?一个有或没有页面对象(和@FindBy)的对象?如果页面的结构发生了很大变化,使用哪种代码进行维护会更容易?
还有其他一些优点,例如像这样的附加注释:
@FindBy(name = "q") @CacheLookup private WebElement searchBox;
这@CacheLookup使得该元素的查找仅发生一次。之后,它将被缓存在变量中,并且访问速度更快。
@CacheLookup
希望这可以帮助。有关更多详细信息,请确保检查 PageFactory 和 PageObject模式 。