为什么要使用@FindBydriver.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/

10-10 21:19