`
unnKoel
  • 浏览: 14195 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论
阅读更多

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();
	}

 


 

  

 

  • 大小: 138.3 KB
2
0
分享到:
评论

相关推荐

    htmlunit依赖jar包

    HTMLUnit是一款功能强大的Java库,它模拟了一个无头Web浏览器,允许开发者在没有真实浏览器环境的情况下执行JavaScript,处理Ajax请求,以及与网页进行交互。这个库对于自动化测试、数据抓取和网页爬虫项目非常有用...

    基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip

    【标题】"基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip" 提供了一个深入的爬虫项目实例,旨在解决AJAX动态网页内容的抓取问题。Apache Nutch是一个开源的网络爬虫框架,而Htmlunit是一个无头...

    htmlunit-2.27-bin

    在没有GUI(图形用户界面)的环境下,HTMLUnit能够解析HTML、CSS、JavaScript,并执行AJAX操作。这对于自动化测试和大数据抓取非常有用,因为它可以模拟用户在浏览器上的各种行为,如点击按钮、填写表单和导航链接,...

    htmlunit包

    3. **支持AJAX**:HTMLUnit可以处理异步加载的数据,这对于现代Web应用的测试至关重要,因为许多网页使用AJAX技术来更新内容。 4. **自动处理JavaScript错误**:HTMLUnit尝试在遇到JavaScript错误时继续执行,这样...

    最新htmlunit 2.29

    - 错误修复:2.29版可能会解决前一版本中报告的问题,提高稳定性和兼容性。 - 功能增强:可能增加了对新网页技术的支持,比如新的HTML5特性或更新的JavaScript API。 5. **应用案例**: - 自动化测试:HTMLUnit...

    jsoup个人小案例(有结合htmlunit的)

    接下来,我们来看HtmlUnit,这是一个无头浏览器库,它模拟了浏览器的行为,能够执行JavaScript,执行表单提交,甚至加载和执行AJAX请求。HtmlUnit的主要特性有: 1. **无头模式**:在后台运行,无需用户界面,适合...

    htmlunit用到的jar包

    这个库在处理JavaScript和Ajax驱动的网站时特别有用,因为它可以执行客户端的JavaScript代码并跟踪网页的状态。HTMLUnit使用Java语言编写,因此在运行时需要依赖一系列的JAR(Java Archive)文件来支持其功能。 在...

    htmlunit jar包

    总的来说,`selenium-htmlunit-driver-2.9.0.jar`是Java Web自动化测试和爬虫的一个利器,尤其在处理JavaScript基础的Web应用程序时,它提供了无图形界面的高效解决方案。然而,为了充分利用其功能,开发者需要对...

    htmlunit-2.9-bin.zip )

    8. **错误处理**:如果网页加载或执行JavaScript时出现错误,HTMLUnit会抛出异常,帮助开发者定位问题。 9. **性能**:由于不需要图形界面,HTMLUnit的运行速度比使用完整浏览器快得多,特别适合大规模的自动化测试...

    htmlunit-2.14.jar下载,全套

    在实际项目中,结合HTMLUnit与其他工具,如Apache HttpClient或者Jsoup,可以构建出强大的网页抓取解决方案。此外,了解如何处理JavaScript异步加载和AJAX请求,以及如何模拟用户行为,都是提高爬虫效率和成功率的...

    htmlunit-2.12

    HTMLUnit是一个强大的Java库,它模拟了一个无头(headless)Web浏览器,允许开发者在没有图形用户界面的情况下...通过深入理解和使用HTMLUnit,开发者可以构建出高效、可靠的自动化测试框架或者网页数据抓取解决方案。

    htmlUnitMatchers:htmlUnit 的 Hamcrest 匹配器

    HTMLUnit支持自动完成、Ajax调用,甚至可以模拟鼠标和键盘事件。 ### Hamcrest简介 Hamcrest是一个Java匹配库,它允许开发者创建自定义的匹配器,这些匹配器可以用于编写更具有表达力的断言。Hamcrest的匹配器是...

    Java爬虫Jsoup+httpclient获取动态生成的数据

    常见的Java爬虫库包括Jsoup、HttpClient、HtmlUnit等,它们各具特色,能够处理不同类型的网页内容。 ### Jsoup库解析 Jsoup是一个强大的HTML解析器,它可以帮助开发者从HTML文档中提取和操作数据。Jsoup可以连接到...

    HttpClient以及获取页面内容应用

    * 解决中文乱码问题 * @param httpUrl * @return */ public static String downloadPage(String httpUrl) { StringBuffer pageBuffer = new StringBuffer(); URL pageUrl = null; try { pageUrl =...

Global site tag (gtag.js) - Google Analytics