我正在使用https://github.com/TestFX/TestFX进行javafx客户端的gui测试。使用testfx查询,我得到了comboBox,但我无法获取其文本进行验证。 comboBox显示枚举值,其文本由转换器和给定资源包解析。 comboBox的场景图如下所示:
javafx.scene.control.ComboBox
javafx.scene.layout.StackPane:arrow-button
javafx.scene.layout.Region:arrow
com.sun.javafx.scene.control.skin.ComboBoxListViewSkin$4$1:null
com.sun.javafx.scene.control.skin.LabeledText:null
comboBox.getValue()
只给我枚举值而不是文本(我可以验证枚举值,但因为它是gui测试,所以应该验证显示的文本)。通过尝试,我发现comboBox.getChildrenUnmodifiable().toString()
打印
[StackPane[id=arrow-button, styleClass=arrow-button], ComboBoxListViewSkin$5[id=list-view, styleClass=list-view], ComboBoxListViewSkin$4$1@4f65f1d7[styleClass=cell indexed-cell list-cell]'StringOfInterest']
最后的字符串'StringOfInterest'正是我所需要的,但目前还不清楚它来自哪里。通过查看javafx的源代码,似乎正在使用Node#toString。但是,目前还不清楚最后一部分('StringOfInterest')的来源。我试图获取ComboBox的所有子项的文本,但有问题的字符串不是它的一部分。
如何提取字符串?
答案 0 :(得分:1)
我找到了一种使用TestFX 4和JavaFX 12在组合框上获取文本的方法。不确定以下内容是否也可以在其他版本上使用。诚然,它感觉有些脆弱和脆弱,但是却给了我想要的结果。
ComboBox<String> comboBox = robot.lookup("#comboBox").queryComboBox();
ListCell<String> listCell = robot
.from(comboBox)
.lookup((Node node) -> node.getStyleClass().contains("list-cell")
&& node.getParent() instanceof ComboBox)
.<ListCell<String>>query();
我首先尝试仅使用lookup(".list-cell")
,但这实际上给了我两个结果,一个结果为null,另一个为所需的文本。具有null的一个嵌套在场景图中的某个位置,但是我们感兴趣的一个具有组合框作为父级。这就是查找检查的内容。
您现在可以验证组合框的文本:
assertThat(listCell.getText()).isEqualTo("expected text");