Java版Serenity Screenplay如何断言下拉选项数量?
Java版Serenity Screenplay断言下拉列表选项数量问题
我正在使用Java版Serenity Screenplay框架,需要断言一个带选项的下拉列表的选项数量为X个。此前一直用Target类定位元素并断言文本等内容,但每个Target仅对应单个元素。我希望获取一个Target列表,进而断言该列表的元素数量为X个。
我了解到Serenity/JS库中有对应工具类,但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))
解决方案
在Java版Serenity Screenplay中,无需额外类即可实现需求,以下是两种可行方式:
自定义Question(符合Screenplay模式)
通过自定义Question封装元素数量的获取逻辑,更贴合框架设计风格:// 定义获取选项数量的Question类 public class OptionCount implements Question<Integer> { private final Target target; private OptionCount(Target target) { this.target = target; } public static OptionCount of(Target target) { return new OptionCount(target); } @Override public Integer answeredBy(Actor actor) { return target.resolveAllFor(actor).size(); } } // 定位所有下拉选项的Target public static final Target DROPDOWN_OPTIONS = Target.the("下拉选项") .located(By.cssSelector("div[data-testid='option']")); // 在测试中执行断言 actor.should( seeThat("下拉选项数量", OptionCount.of(DROPDOWN_OPTIONS), equalTo(6)) );直接获取元素列表断言
若不需要复用逻辑,可直接在测试步骤中调用resolveAllFor方法获取元素列表并断言:// 定位所有下拉选项的Target public static final Target DROPDOWN_OPTIONS = Target.the("下拉选项") .located(By.cssSelector("div[data-testid='option']")); // 测试步骤中直接断言 List<WebElement> options = DROPDOWN_OPTIONS.resolveAllFor(actor); assertThat(options.size(), equalTo(6));
关键说明
Java版Serenity的Target类本身提供resolveAllFor(Actor)方法,可直接返回匹配该定位器的所有元素列表,不需要依赖额外类。第一种方式更符合Screenplay模式的关注点分离原则,适合需要复用的场景;第二种方式则更简洁,适合简单的单次断言场景。
内容的提问来源于stack exchange,提问作者Mo0rBy
相关产品推荐
相关产品推荐

