我正在使用 Java 编写的 Serenity 剧本。我有一个包含一些选项的下拉列表,我想断言选项下拉列表有 X 个选项。我一直在使用
Target
类来查找元素并断言它们包含正确的文本等,但我的每个目标都是针对单个元素的。我想获取目标列表,然后断言该列表中有 X 个元素。
我在 Serenity/JS 库中找到了一个名为
TargetElements
的类(https://serenity-js.org/modules/protractor/class/src/screenplay/questions/targets/TargetElements.ts~TargetElements.html)这看起来正是我所需要的,但它在 Java 版本的 Serenity 中不可用。
这是我使用的典型
Target
的示例:
public static final Target OPTIONS_LIST_FIELD = Target.the("options field")
.located(By.cssSelector("div[data-testid='option_field']"));
我想做这样的事情:
public static final List<Target> OPTIONS_LIST = Target.all("options")
.located(By.cssSelector("div[data-testid='option']"));
assertThat(OPTIONS_LIST.size(), equalTo(6))
Target
是一个抽象类,其预期用途是能够定位和解析网页上的元素。这将为您提供 ByTarget
或 XPathOrCssTarget
的实例。
核心,目标应该是获取 WebElements 列表(Serenity 中的
WebElementFacade
),可以在其上执行操作或解析以断言数据。
以下满足大部分要求:
List<String> webElementsValues = Target.the("options field").located(By.cssSelector("div[data-testid='option_field']")).resolveForAll(new Actor("Stack")).texts();
List<WebElementFacade> webElements = Target.the("options field").located(By.cssSelector("div[data-testid='option_field']")).resolveForAll(new Actor("Stack"));
但是,如果您仍然想要
List<Target>
元素,可以采用以下方法,这可能需要根据您的应用程序进行一些调整。
public static List<Target> getListOfTargetElements() {
int sizeOfOptions = Target.the("Parent Element").locatedBy("//..locate your element here").resolveAllFor(new Actor("byteish")).size();
List<Target> listOfTarget = new ArrayList();
for (int i = 0; i<sizeOfOptions;i++){
listOfTarget.add(Target.the("element:"+i).locatedBy("div/eleme["+i+"]"));
}
return listOfTarget;
}