我正在使用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
,它只是一个文本`。我不知道为什么会有这种差异。请告诉我如何解决这个问题。
谢谢:)
答案 0 :(得分:1)
有多种方法可以使用htmlunit提交html表单。
创建一个提交按钮并附加到表单然后单击它。像这样:
HtmlElement ele=page.createElement("input");
ele.setAttribute("type","submit");
form.appendChild(ele);
ele.click();
参考文献: First - Html Page
第二种方法
只需触发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()
也会在代码中执行格式更改。
说过我可以想到两个选项:
我敢打赌这是第一个。为了帮助您调试启用/禁用JavaScript以及将asXml()
的结果与HtmlUnit正在下载的页面的实际内容的结果进行比较(我的意思是,没有处理)。要了解有关如何执行此操作的详细信息,请查看此问题:
How to get the pure raw HTML of a page in HTMLUnit while ignoring JavaScript and CSS?
如果您有效地发现它是HtmlUnit的错误并且网页处理失败,请在SourceForge项目中提交一个新错误。我还希望您提供测试用例来重现这一点。