如何通过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
.
第一种方法是最好的方法,大多数人都遵循。
在我们的项目中,我们有多个 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
.
第一种方法是最好的方法,大多数人都遵循。