HTMLUnit:与Chrome中的查看源时不同的代码

时间:2013-09-18 14:07:52

标签: java htmlunit

我正在使用HTMLUnit来获取网页上的页面。在此网页中,有一个表单。当我从Chrome加载并查看源代码时:类似这样的内容:

<form name="form" method="post" onsubmit="return checkDate();">
     <input name="check_in_date" id="check_in_date" readonly="readonly" type="text" class="hasDatepicker"/>
     <input name="check_out_date" id="check_out_date" readonly="readonly" type="text" class="hasDatepicker"/>
     <input name="check_availability" value="test condition" type="submit"/>
</form>

但是当我通过此代码使用HTMLUnit加载时:

String url = "sample link";
WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = webClient.getPage(url);
System.out.println(page.asXML());

我得到了不同的HTML代码。更多细节:

<form name="form" method="post" onsubmit="return checkDate();">
         <input name="check_in_date" id="check_in_date" readonly="readonly" type="text" class="hasDatepicker"/>
         <input name="check_out_date" id="check_out_date" readonly="readonly" type="text" class="hasDatepicker"/>
         <input name="check_availability" value="test condition" type="text"/>
 </form>

这里的不同之处是:最后一行:<input name="check_availability" value="test condition" type="text"/>现在输入文字,而不是提交,所以我不能用这种代码:

HtmlForm form = page.getFormByName("form");
HtmlSubmitInput submit = form.getInputByName("check_availability"); // error at this line
page = submit.click();

错误,因为现在,此字段不再是button,它只是一个文本`。我不知道为什么会有这种差异。请告诉我如何解决这个问题。

谢谢:)

2 个答案:

答案 0 :(得分:1)

有多种方法可以使用htmlunit提交html表单。

创建一个提交按钮并附加到表单然后单击它。像这样:

HtmlElement ele=page.createElement("input");
ele.setAttribute("type","submit");
form.appendChild(ele);
ele.click();

参考文献: First - Html Page

Second DomNode

Third - DomElement

第二种方法

只需触发javascript即可提交表单

String javaScriptCode="document.getElementById("formid").submit()";
Object result = page.executeJavaScript(javaScriptCode).getJavaScriptResult();

第二种方法不起作用,因为没有与表格相关联的ID,但为了完整答案我已经提到过。

警告:上述代码未经过测试,但可以正常使用。

答案 1 :(得分:1)

在回答你的问题之前的一些评论:

您在Chrome检查器中看到的内容与HtmlUnit返回的代码不同是有道理的。此外,您在Chrome检查器中看到的代码与您在查看页面本身的源代码(CTRL + U)时看到的代码不同,因为前者已经执行过Javascript。

HtmlUnit的javascript引擎与Chrome不同,所以即使您在HtmlUnit中启用了JavaScript,也可能会得到不同的结果。甚至asXml()也会在代码中执行格式更改。

说过我可以想到两个选项:

  1. 您正在将已经处理过javascript的网页与已经处理过的网页进行比较
  2. 您发现了一个错误
  3. 我敢打赌这是第一个。为了帮助您调试启用/禁用JavaScript以及将asXml()的结果与HtmlUnit正在下载的页面的实际内容的结果进行比较(我的意思是,没有处理)。要了解有关如何执行此操作的详细信息,请查看此问题:

    How to get the pure raw HTML of a page in HTMLUnit while ignoring JavaScript and CSS?

    如果您有效地发现它是HtmlUnit的错误并且网页处理失败,请在SourceForge项目中提交一个新错误。我还希望您提供测试用例来重现这一点。