2012-12-06 3 views
2

이 웹 페이지에서 데이터를 가져 오려고합니다 : http://www.atm-mi.it/en/Giromilano/Pages/default.aspx. 기본적으로 저는 HtmlUnit을 Java에서 사용하여 왼쪽 열의 중간에있는 "Route and timetable finder"와 상호 작용하고 선택 항목의 각 옵션을 반복하고 "찾기"를 클릭 한 다음 결과 페이지에서 필요한 데이터를 수집합니다.라디오 버튼 입력에서 HtmlUnit 클릭()이 예상대로 작동하지 않습니다.

도시 노선의 데이터를 추출하는 데 문제가 없었지만 위의 라디오 버튼을 처리 할 수 ​​없습니다. 예를 들어 브라우저에서 '지하'를 클릭하면 다른 옵션이있는 새 페이지가 나타납니다. 아래에서 선택하십시오.

하지만 계속 동일하게 선택하십시오. 정확하게 말하면 동일한 페이지가 계속 나타납니다 (페이지 2페이지과 동일한 HTML 코드를 사용합니다).

분명히 .click() 함수에서 문제가 발생 했겠지만 무엇을해야할까요?

이 내 코드의 간단한 버전 :

<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"> 

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입니다 편집 : 좋아, 그래서 다른 접근 방식을 시도했습니다 : 자바 스크립트 엔진 문제의 일종으로 보았 기 때문에, 나는 JavaScript를 시도하고 비활성화 할 수있는 생각, 직접 onclick 작업을 수행. 이것은 원래 자바 스크립트 함수입니다 :

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

관련 문제