2012-12-06 56 views
2

我想从这个网页获取数据:http://www.atm-mi.it/en/Giromilano/Pages/default.aspx。基本上,我使用Java中的HtmlUnit与左列中间的“路由和时间表查找程序”进行交互,循环选择每个选项,单击“查找”并从结果页面收集所需的数据。点击的HtmlUnit()单选按钮输入工作不正常

我已经没有问题,提取城市路线数据,但似乎无法应付上面的单选按钮:在浏览器中点击“地下”,例如,应使在不同的选项了新的一页选择下面。

但我不断收到像以前一样选择;更精确地说,我不断收到同一个页面(第2页具有相同的HTML代码)。

显然必须的东西在。点击()函数是想错了,但什么?

这是我的一个简单的代码版本:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6); 
webClient.setThrowExceptionOnScriptError(false); 

HtmlPage page = webClient.getPage("http://www.atm-mi.it/en/Giromilano/Pages/default.aspx"); 

HtmlRadioButtonInput radioButton2 = (HtmlRadioButtonInput) page.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0"); 
HtmlPage page2 = radioButton2.click(); 

HtmlSelect lineSelect = (HtmlSelect) page2.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_txt_dp_lines"); 
int size = lineSelect.getOptionSize(); 
System.out.println(size); 

这是单选按钮输入HTML:

<input id="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0" type="radio" name="ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl" value="0" onclick="javascript:setTimeout('__doPostBack(\'ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl$0\',\'\')', 0)" /> 
<label for="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0">Underground</label> 

的选择:

<select name="ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$txt_dp_lines" id="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_txt_dp_lines" class="dplinee"> 

编辑: 好了,我已经尝试了不同的方法:因为它看上去像某种JavaScript引擎的问题,我想我可以尝试禁用JavaScript中,执行的onclick行动喽。这是原来的JavaScript函数:

var theForm = document.forms['aspnetForm']; 
function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 

这就是我所做的:

HtmlForm aspnetForm = (HtmlForm) page.getElementById("aspnetForm"); 
HtmlHiddenInput eventTarget = (HtmlHiddenInput) page.getElementById("__EVENTTARGET"); 
HtmlHiddenInput eventArgument = (HtmlHiddenInput) page.getElementById("__EVENTARGUMENT"); 

eventTarget.setValueAttribute("ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl$0"); 
eventArgument.setValueAttribute(""); 
HtmlElement submitButton = (HtmlElement) page.createElement("button"); 
submitButton.setAttribute("type", "submit"); 
aspnetForm.appendChild(submitButton); 
HtmlPage page2 = submitButton.click(); 

都好,只是我还是继续得到同样页面相同的旧选择。 我知道这是一个相当漫长而无聊的问题,但我想我可以随时更新它。我希望有人最终能够耐心地尝试一下(至少证实我没有犯一些明显的错误)。

回答

2

我终于找到了一种方法来完成这项工作。第二种方法几乎是正确的。我正确地提交表单,但与正常浏览有所不同:我没有真正检查单选按钮。显然,目标页面也使用了这些信息。通过添加这个

HtmlRadioButtonInput radioButton = (HtmlRadioButtonInput) page.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0"); 
radioButton.setChecked(true); 

到我以前的尝试提交行动完美。尽管如此,我仍然不知道为什么.click()方法无法按预期工作,但这对我来说已经足够好了。

+0

同样的问题在这里,但你的解决方案帮助。谢谢! – Tomasz