Serenity Screenplay-目标列表



我在Java中使用Serenity脚本。我有一个带有一些选项的下拉列表,我想断言选项下拉列表有X个选项。我一直在使用Target类来查找元素,并断言它们包含正确的文本等,但我的每个Targets都针对一个元素。我想得到一个目标列表,然后断言该列表中有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是一个抽象类,其预期用途是能够定位和解析网页上的元素。这将为您提供一个ByTargetXPathOrCssTarget的实例。

在核心,目标应该是获得一个WebElement列表(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 = null;
for (int i = 0; i<sizeOfOptions;i++){
listOfTarget.add(Target.the("element:"+i).locatedBy("div/eleme["+i+"]"));
}
return listOfTarget;
}

最新更新