我正在编写一个使用HtmlUnit屏幕抓取一些数据的应用程序。哪些字段来自页面的哪些部分以及检索它们的XPath的逻辑变得有点复杂,所以在重构之前我想编写一些简单的单元测试。我使用'page.asXml()'方法获取页面XML并将其保存为我的测试资源文件夹中的文件,但是如何将其作为HtmlPage加载回来?
例如
HtmlPage page = webClient.getPage(url);
System.out.println(page.asXml());
现在在我的单元测试中我想做相同的:
HtmlPage page = new HtmlPage(myXmlTestFile);
但我似乎无法找到任何可以做到这一点的事情。有什么想法吗?
答案 0 :(得分:3)
我的最终解决方案(与其他一些SO帖子相结合):
URL url = new URL("http://www.example.com");
InputStream is = this.getClass().getClassLoader().getResourceAsStream("myPageXmlFile.xml");
String xmlPageString = IOUtils.toString(is);
StringWebResponse response = new StringWebResponse(xmlPageString, url);
WebClient client = WebClientConnector.createWebClient(false); // helper method for creating a WebClient instance
HtmlPage page = HTMLParser.parseXHtml(response, client.getCurrentWindow());
答案 1 :(得分:1)
我认为你应该尝试三件事:
将其另存为XML,然后再从本地文件系统中获取(这将是您尝试做的事情):
// save the page as a string into file "myfile.xml" and then...
HtmlPage page = webClient.getPage("file:///home/Matt/Desktop/myfile.xml");
将其另存为HTML页面,然后按照与上一项相同的方式加载:
String myFile = "file:///home/Matt/Desktop/myfile.html";
page.save(myFile);
HtmlPage loadedPage = webClient.getPage(myFile);
而且,最有可能的最佳方式是:在下载时处理页面并保存所需的数据而不是整页:
String pieceOfData = page.getFirstByXPath("//div[id='magic_id']");
aCSVFile.write(pieceOfData);
答案 2 :(得分:0)
我在单元测试中使用它:
URL input = getClass().getResource("/path/to/file.xml");
XmlPage xmlDoc = new WebClient().getPage(input);
这对CI更好,因为您不需要使用file:///...