好吧,尽管这是一个可怕的解决方案(实际上,解决方法……),但我最终决定按照HtmlUnit的开发人员之一的建议,在HtmlUnit中禁用自动加载帧。这是我详细做的:
- 下载了HtmlUnit源
- 从这里下载maven
- 注释了
loadframes()
位于以下位置的HtmlPage类的方法的内容(方法的主体,而不是声明)htmlunit-2.9/src/main/java/com/gargoylesoftware/htmlunit/html
- 使用以下命令编译了此自定义代码跳过测试:
mvn -Dmaven.test.skip=true clean compile package
- 找到新
htmlunit-2.9.jar
的htmlunit-2.9/artifacts
并替换了当前htmlunit-2.9.jar
库文件 - 这一步可能是最微妙的一步,因为它取决于每个应用程序。但是,我将向您展示我需要对应用程序进行的更改。
您知道我的原始代码如何(看问题)。这将从页面下载所有框架和iframe。我正在添加一个示例,说明如何获取仅包含所需框架的框架页面:
try { HtmlPage page = webClient.getPage("http://www.w3schools.com/HTML/tryit.asp?filename=tryhtml_noframes"); HtmlInlineframe frame = page.getFirstByXPath("//iframe[@name='view']"); page = webClient.getPage(page.getFullyQualifiedUrl(frame.getSrcAttribute())); System.out.println(page.asXml());} catch (Exception e) { e.printStackTrace();}更改此库后,一旦
getPage()方法完成,框架的内容将为空。注意它不会为空,看起来就像只是返回一个空框架。我们需要做的是手动下载我们感兴趣的框架的内容,这就是为什么我要
getPage()再次执行。
好吧,这就是我设法使用HtmlUnit有选择地下载框架和iframe的方式。任何有关如何改善这一点的想法将不胜感激。无论如何,我希望将来会增加某种方式来禁用HtmlUnit本身中的帧加载,也许添加诸如之类的方法
getPage(URLurl, boolean downloadframes)。
希望这可以帮助某人!



