Browser#getText()返回空字符串

时间:2017-04-13 13:44:49

标签: java unit-testing swt

我发现了SWT Browser小部件非常奇怪的行为:

@Test
public void test() throws Exception {
    Shell shell = new Shell();
    Browser browser = new Browser(shell, SWT.NONE);
    browser.setText("Hello World!");
    shell.open();

    Assert.assertEquals("Hello World!", browser.getText());
}

此测试失败,因为Browser#getText()返回一个空字符串。

An other question建议可能是因为Browser仍在加载页面,但使用setText不会触发加载(因为HTML已经存在),而ProgressListener 1}}永远不会被调用。

JavaDoc说:返回一个带有HTML的字符串,表示当前页面的内容。由于某种原因返回空字符串没什么。

如何获取浏览器的文本? (对于像上面这样的测试用例我需要它,所以“等待”Browser小部件是不可能的。我不确定这两种方式是否都有效。)

2 个答案:

答案 0 :(得分:1)

下面的代码打印Browser的文字:

public static void main(String[] args)
{
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    shell.setText("StackOverflow");

    Browser browser = new Browser(shell, SWT.NONE);
    browser.setText("THIS IS A TEST");

    shell.pack();
    shell.open();

    display.asyncExec(() -> System.out.println(browser.getText()));

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

请注意,您获得的文字与您设置的文字不同。浏览器会添加<html><head><body>代码:

<html><head></head><body>THIS IS A TEST</body></html>

我之前从未为SWT编写测试,但是你的代码(while(!shell.isDisposed())位)中是否还有SWT事件循环?

答案 1 :(得分:1)

打开Shell后,您需要致电Display.readAndDispatch()以确保处理所有排队的事件(包括在Browser上设置文字):

@Test
public void test() throws Exception {
    final Shell shell = new Shell();
    final Browser browser = new Browser(shell, SWT.WEBKIT);
    browser.setText("Hello World!");
    shell.open();
    while (shell.getDisplay().readAndDispatch()) {
        // Loop here in case there is more than one event in the queue
        // Also, it may be advised to call Display.sleep() here as well
    }
    Assert.assertEquals("Hello World!", browser.getText());
}

请注意,我必须添加SWT.WEBKIT样式位才能在我的机器上运行 - 您可能不需要它。

老实说,我不确定为什么我没有遇到@Baz答案中提到的HTML标签问题,但上述测试通过了。也许其他人可以对此有所了解,因为我从未使用过Browser小部件。

顺便说一下,围绕SWT组件编写测试是一个巨大的痛苦,如果有任何方法可以重构或重新设计代码,这样就不必直接测试小部件(特别是当你必须创建和打开一个小部件时) Shell),我强烈建议。