想试试HtmlUnit在测试网页上的表现,访问一个网页跳转到下一个网页之后,总是返回在server上找不到的页面,用IE访问就是好的。另外有个奇怪的现象,在IE访问网页之后,再run写好的HtmlUnit代码就能顺利通过。关了IE之后,10分钟左右,代码都能通过。超过这个时间之后,就怎么折腾也通不过。
根据这个现象分析,感觉很象是cookie在捣鬼。cookie有效的时候,HtmlUnit代码就能用IE产生的cookie发送请求,cookie失效之后,server端对cookie验证不通过,自然指向错误提示的页面。
接下来在HtmlUnit的老巢里一通搜索,能找到的信息是在可怜。开源的东西,一个最大的短处就是文档很不完善。不过这也是人家可以赚钱的地方,什么东西都公布出来整理成文档了,哪一天商业化了,咨询费一分钱都收不到了。
最终还是通过google搜到了HtmlUnit的wiki,它的站点还是有不少有用的信息,其中有一个帖子,题目是Single Cookie Header,内容如下:
Some web sites, especially those driven by Microsoft products (in my experience), require that cookies be sent from the web browser back to the server using a single Cookie: http header. The default behavior of HtmlUnit, which uses commons-httpclient, is to send multiple Cookie:headers, one for each cookie. See Bug 1117500 for details.
Some web sites, especially those driven by Microsoft products (in my experience), require that cookies be sent from the web browser back to the server using a single Cookie: http header. The default behavior of HtmlUnit, which uses commons-httpclient, is to send multiple Cookie:headers, one for each cookie. See Bug 1117500 for details.
意思是说,有些站点(大多数是使用微软产品的)要求cookie从浏览器端发送到server时,要使用单一cookie。而HtmlUnit用的HttpClient却是多个cookie。用一句
这样说来,即使发送的内容一样,但因为不是一次发送完成,服务期端就会认为cookie的内容不正确。这个我在用HttpClient做工具的时候已经遇到过一次。花了2天时间,仔细研究真实浏览器和这个假浏览器之间到底有什么差异。时间长了都要忘记了,这次又遇到这样的问题,还是记下来的好,免得以后又要忘记。
HtmlUnit这样的好工具要是被这样的问题绊住而放弃真是太不值了。
System.setProperty("apache.commons.httpclient.cookiespec", CookiePolicy.BROWSER_COMPATIBILITY);
或者DefaultHttpParams.getDefaultParams().setBooleanParameter(HttpMethodParams.SINGLE_COOKIE_HEADER, true); (我用的是后面这个)
就可以解决问题了。