gpt4 book ai didi

selenium - Selenium @FindBy与driver.findElement()

转载 作者:行者123 更新时间:2023-12-03 10:09:43 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com