提问者:小点点

Serenity剧本-目标列表


我正在使用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))

共1个答案

匿名用户

Target是一个抽象类,它的预期用途是能够定位和解析网页上的元素。这将为您提供ByTargetXPathOrCssTarget的实例。

核心是,目标应该是获取一个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;
}