1.问题
参照htmlUnit官方get started文档 的Submitting a form 栏,编写一个提交表单到百度搜索的例子,执行报错,错误信息:
严重: runtimeError: message=[An invalid or illegal selector was specified (selector: 'meta:eq(0)' error: Invalid selector: meta:eq(0)).] sourceName=[http://s1.bdstatic.com/r/www/cache/static/jquery/jquery-1.10.2.min_f2fb5194.js] line=[11] lineSource=[null] lineOffset=[0]
例子代码如下:
@Test public void submittingForm() throws Exception { final WebClient webClient = new WebClient(); // Get the first page final HtmlPage page1 = webClient.getPage("http://www.baidu.com/"); // Get the form that we are dealing with and within that form, // find the submit button and the field that we want to change. final HtmlForm form = page1.getFormByName("f"); final HtmlSubmitInput button = form.getInputByValue("百度一下"); final HtmlTextInput textField = form.getInputByName("wd"); // Change the value of the text field textField.setValueAttribute("htmlUnit"); // Now submit the form by clicking the button and get back the second // page. final HtmlPage page2 = button.click(); System.out.println(page2.asXml()); webClient.closeAllWindows(); }
2.查找原因
(1)从错误结果看,是jquery 的选择器非法或无效。
(2)选择器怎么会无法定位到元素的呢?是不是html元素没有加载到,而执行的js需要选择定位它,然后导致上述错误?
(3)在百度 上真实搜索htmlUnit 与上述程序打印的html文档作比较。发现确实有不同,前者html页body中确实存在"<meta http-equiv="refresh" ..."标签,而后者没有。
(4)怎么会没有的呢?html元素除了静态请求得到外,还有一种是ajax动态请求得到,会不会ajax动态请求在我执行page2.asXml时还没执行?
(5)到htmlUnix use script栏下查看资料,发现其中一句“Usually, you should wait() or sleep() a little, as HtmlUnit can finish before the AJAX response is retrieved from the server, please read this FAQ”,原来ajax请求真会在htmlUnit finish 后执行。点击this FAQ找到解决方法
3.解决方法
(1)第一种方法貌似是让ajax的异步执行重新同步,测试下来,仍然报错。
(2) 第二种方法是让使用HtmlUnit的main线程等待指定的毫秒数,给ajax执行时间,一旦时间用完,返回还未执行的ajax数量,并继续执行main线程,测试下来可行。
(3) 第三种方法是挂起main线程直到条件满足(比如页面中某个元素存储),或者超出一定的次数。测试下来可行。
第三种方法个人觉得比较好,所以我采用了第三种方式,代码如下:
@Test public void submittingForm() throws Exception { final WebClient webClient = new WebClient(); // Get the first page final HtmlPage page1 = webClient.getPage("http://www.baidu.com/"); // Get the form that we are dealing with and within that form, // find the submit button and the field that we want to change. final HtmlForm form = page1.getFormByName("f"); final HtmlSubmitInput button = form.getInputByValue("百度一下"); final HtmlTextInput textField = form.getInputByName("wd"); // Change the value of the text field textField.setValueAttribute("htmlUnit"); // Now submit the form by clicking the button and get back the second // page. final HtmlPage page2 = button.click(); for (int i = 0; i < 20; i++) { if (!page2.getByXPath("//div[@class='c-gap-top c-recommend']").isEmpty()) { break; } synchronized (page2) { page2.wait(500); } } FileWriter writer = new FileWriter("baidu.html"); writer.write(page2.asXml()); writer.close(); // System.out.println(page2.asXml()); webClient.closeAllWindows(); }
相关推荐
HTMLUnit是一款功能强大的Java库,它模拟了一个无头Web浏览器,允许开发者在没有真实浏览器环境的情况下执行JavaScript,处理Ajax请求,以及与网页进行交互。这个库对于自动化测试、数据抓取和网页爬虫项目非常有用...
【标题】"基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip" 提供了一个深入的爬虫项目实例,旨在解决AJAX动态网页内容的抓取问题。Apache Nutch是一个开源的网络爬虫框架,而Htmlunit是一个无头...
在没有GUI(图形用户界面)的环境下,HTMLUnit能够解析HTML、CSS、JavaScript,并执行AJAX操作。这对于自动化测试和大数据抓取非常有用,因为它可以模拟用户在浏览器上的各种行为,如点击按钮、填写表单和导航链接,...
3. **支持AJAX**:HTMLUnit可以处理异步加载的数据,这对于现代Web应用的测试至关重要,因为许多网页使用AJAX技术来更新内容。 4. **自动处理JavaScript错误**:HTMLUnit尝试在遇到JavaScript错误时继续执行,这样...
- 错误修复:2.29版可能会解决前一版本中报告的问题,提高稳定性和兼容性。 - 功能增强:可能增加了对新网页技术的支持,比如新的HTML5特性或更新的JavaScript API。 5. **应用案例**: - 自动化测试:HTMLUnit...
接下来,我们来看HtmlUnit,这是一个无头浏览器库,它模拟了浏览器的行为,能够执行JavaScript,执行表单提交,甚至加载和执行AJAX请求。HtmlUnit的主要特性有: 1. **无头模式**:在后台运行,无需用户界面,适合...
这个库在处理JavaScript和Ajax驱动的网站时特别有用,因为它可以执行客户端的JavaScript代码并跟踪网页的状态。HTMLUnit使用Java语言编写,因此在运行时需要依赖一系列的JAR(Java Archive)文件来支持其功能。 在...
总的来说,`selenium-htmlunit-driver-2.9.0.jar`是Java Web自动化测试和爬虫的一个利器,尤其在处理JavaScript基础的Web应用程序时,它提供了无图形界面的高效解决方案。然而,为了充分利用其功能,开发者需要对...
8. **错误处理**:如果网页加载或执行JavaScript时出现错误,HTMLUnit会抛出异常,帮助开发者定位问题。 9. **性能**:由于不需要图形界面,HTMLUnit的运行速度比使用完整浏览器快得多,特别适合大规模的自动化测试...
在实际项目中,结合HTMLUnit与其他工具,如Apache HttpClient或者Jsoup,可以构建出强大的网页抓取解决方案。此外,了解如何处理JavaScript异步加载和AJAX请求,以及如何模拟用户行为,都是提高爬虫效率和成功率的...
HTMLUnit是一个强大的Java库,它模拟了一个无头(headless)Web浏览器,允许开发者在没有图形用户界面的情况下...通过深入理解和使用HTMLUnit,开发者可以构建出高效、可靠的自动化测试框架或者网页数据抓取解决方案。
HTMLUnit支持自动完成、Ajax调用,甚至可以模拟鼠标和键盘事件。 ### Hamcrest简介 Hamcrest是一个Java匹配库,它允许开发者创建自定义的匹配器,这些匹配器可以用于编写更具有表达力的断言。Hamcrest的匹配器是...
常见的Java爬虫库包括Jsoup、HttpClient、HtmlUnit等,它们各具特色,能够处理不同类型的网页内容。 ### Jsoup库解析 Jsoup是一个强大的HTML解析器,它可以帮助开发者从HTML文档中提取和操作数据。Jsoup可以连接到...
* 解决中文乱码问题 * @param httpUrl * @return */ public static String downloadPage(String httpUrl) { StringBuffer pageBuffer = new StringBuffer(); URL pageUrl = null; try { pageUrl =...