一尘不染

selenium@FindBy与driver.findElement()

selenium

为什么要使用@FindByvs driver.findElement()

@FindBy迫使我将所有变量都移到类级别(当大多数变量只需要在方法级别时)。似乎唯一可以买给我的东西是我可以打电话给我PageFactory.initElements(),它可以为我处理延迟初始化。

我想念什么?


阅读 298

收藏
2020-06-26

共1个答案

一尘不染

粗略地讲,@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")
@CacheLookup
private WebElement searchBox;

@CacheLookup使得该元素的查找仅发生一次。之后,它将被缓存在变量中,并且访问速度更快。

希望这可以帮助。有关更多详细信息,请确保检查
PageFactory
PageObject模式

2020-06-26