我正在使用SerenityJava剧本。我有一个包含一些选项的下拉列表,我想断言选项下拉列表有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"));
但是如果你仍然想要一个列表
public static List<Target> getListOfTargetElements() {
int sizeOfOptions = Target.the("Parent Element").locatedBy("//..locate your element here").resolveAllFor(new Actor("byteish")).size();
List<Target> listOfTarget = null;
for (int i = 0; i<sizeOfOptions;i++){
listOfTarget.add(Target.the("element:"+i).locatedBy("div/eleme["+i+"]"));
}
return listOfTarget;
}