1

我正在使用https://github.com/TestFX/TestFX进行 javafx 客户端的 gui 测试。通过 testfx 查询,我得到了组合框,但无法获取其文本进行验证。组合框显示其文本由转换器和给定资源包解析的枚举值。组合框的场景图如下所示:

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 的所有子项的文本,但有问题的字符串不是其中的一部分。

如何提取字符串?

4

1 回答 1

2

我找到了一种使用 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");
于 2019-09-07T14:38:49.057 回答