为什么要使用@FindBy
和driver.findElement()
?@FindBy
迫使我将所有变量都移到类级别(大多数变量只需要在方法级别时使用)。似乎唯一能买到我的东西是我可以调用PageFactory.initElements()
,它可以为我处理延迟初始化。
我想念什么?
最佳答案
粗略地说,@FindBy
只是查找元素的另一种方式(“常规方式”就是您所说的driver.findElement()
)。
但是,该注释的最大优势不是它本身。最好用于支持 PageObject pattern 。
简而言之,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")
@CacheLookup
private WebElement searchBox;
该
@CacheLookup
使对该元素的查找仅发生一次。之后,它将被缓存在变量中,并且访问速度更快。希望这可以帮助。有关更多详细信息,请确保检查 PageFactory 和 PageObject pattern 。
关于selenium - Selenium @FindBy与driver.findElement(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18436102/