当前位置: 首页 > 面试题库 >

selenium@FindBy与driver.findElement()

景永望
2023-03-14
问题内容

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

@FindBy迫使我将所有变量都移到类级别(当大多数变量只需要在方法级别时)。似乎唯一可以买给我的东西是我可以打电话给我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吗?)

在什么代码中会有更多更改才能使它再次运行?一个有或没有页面对象(和@FindBy)的对象?如果页面的结构发生了很大变化,使用哪种代码进行维护会更容易?

还有其他一些优点,例如像这样的附加注释:

@FindBy(name = "q")
@CacheLookup
private WebElement searchBox;

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

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



 类似资料:
  • 我在为自动化工作,我试图点击一个元素,这个元素没有id,classname,所以我使用xpath。为了改进我的代码,我想通过href找到这个元素,所以我使用: 我还尝试了: 但我的代码找不到webElement,它对其他href有效,但不是全部。我认为问题在于开发工具,我将向您展示以下元素: 你知道这个问题吗,为什么它不起作用?谢谢。

  • 我确实在这里遇到了这个问题,但根据线程“错误消失了,我不知道它是如何修复的”...在selenium中尝试使用@FindBy注释时出错 这是我写的代码。奇怪的是,我已经在page对象类上定义了另一个web元素,它工作得很好。我似乎就是不明白问题出在哪里。我只是在学硒,从来没有遇到过这个问题。我试着在网上搜索答案,但似乎找不到这个特定问题的答案。 这是page对象类中的第一个web元素,它工作得很好

  • Selenium FindBy注释是否实际实例化了WebElement实例,如果是,使用它们的框架的内涵是什么? 我在我的页面对象中所做的事情现在看起来是这样的。我的所有测试框架方法都将定位器作为参数(而不是WebElement实例)。 我的问题是,在类实例化时使用FindBy实例化WebElement实例吗?如果是这样,那么我怀疑我的框架方法需要使用WebElement实例。这是正确的吗,在框架

  • 我正在尝试将我的selenium测试转换为使用页面对象模型(以及扩展为@FindBy)。我有几个这样的对象定义: 将父对象转换为使用FindBy很容易: 基本上,如果可能的话,我想这样做(我知道这不是真正的代码,这只是一个伪示例: 但是,有没有一种方法可以使用FindBy在父元素中定位子元素呢 。我需要这样做,因为我的目标是页面上的特定元素,这些元素可能与页面上的其他元素共享相同的名称或类名。谢谢

  • 我将selenium与java和以下pom包一起使用, 我可以使用WebDriver和其他对象,但当我试图使用注释@findby时,我的项目似乎找不到满足它的包“不能解析为类型”,也不建议使用selenium包。 selenium的注释系统位于哪个maven存储库中?还是我错过了什么? 谢谢。

  • Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。 Sel