如何通过Selenium识别特定的Page Object片段成员元素

How to identify a particular Page Object fragment member element through Selenium

在我们的项目中,我们有多个 selenium 测试 运行 用黄瓜测试特定组件。其中一个组成部分是两个标识符,我们称之为国家标识符和站点标识符。 这些有以下 HTML:

<div class="identifiers">   
    <div class="country-identifier">
        <span class="ident-label">
            Germany
        </span>
    </div>
    <div class="site-identifier">
        <span class="ident-label">
            Gaming
        </span>
    </div>
</div>

现在我们的测试有两个模型,每个标识符一个:

@PageObject(css = "div.country-identifier")
@Named("CountryIdentifier")
@ScenarioScoped
public class CountryIdentifier {

    @Inject
    @CurrentScope
    private WebElement scope;

    @FindBy(className = "ident-label")
    @CacheLookup
    private WebElement label;

}

并且:

@PageObject(css = "div.site-identifier")
@Named("SiteIdentifier")
@ScenarioScoped
public class SiteIdentifier {

    @Inject
    @CurrentScope
    private WebElement scope;

    @FindBy(className = "ident-label")
    @CacheLookup
    private WebElement label;

}

现在的问题是,当我想访问站点标识符的标签时,WebElement 标签的值为 Germany 而不是 Gaming.这是因为获取值的 css 选择器显然只应用了 class 名称 ident-label 而没有考虑容器 class。我希望为找到标签而生成的选择器将为页面对象定义的 css 与 @FindBy 注释中的选择器组合在一起。 有没有办法告诉 Web 驱动程序仅在 @PageObject 注释的 css 选择器指定的容器范围内通过 class 名称查找元素?或者我是否需要 FindBy 注释中的完整 css 选择器,例如:

@FindBy(css = "div.site-identifier .ident-label")

@FindBy(css = "div.country-identifier .ident-label")

看来你快到了。您可以使用以下定位符来识别相应的元素:

  • Germany:

    @FindBy(css = "div.country-identifier span.ident-label")
    
  • Gaming:

    @FindBy(css = "div.site-identifier span.ident-label")
    

更新

根据您询问的有关 的评论更新,可以仅指定“.ident-label”并使驱动程序仅在页面 css 指定的容器内搜索对象注解,答案是。这是因为 class ident-label 出现在 <div> 标签下,如下所示:

  • Germany:

    <span class="ident-label">
        Germany
    </span>
    
  • Gaming:

    <span class="ident-label">
         Gaming
    </span>
    

因此,WebDriver 实例无法区分它们,并且总是会根据现行 HTML DOM.

选择第一个匹配项

解决方案

可以有如下两种解决方法:

  • 最简单的方法是借助父 <div> 标签,每个 标签都有不同的 class 属性。
  • 否则使用index.

第一种方法是最好的方法,大多数人都遵循。