我发现了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
小部件是不可能的。我不确定这两种方式是否都有效。)
答案 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
),我强烈建议。