HtmlUnit не находит форму и не обрабатывает обратную передачу - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь использовать HtmlUnit (2.35) в Java по этому URL-адресу https://www.pharmacy.ohio.gov/Licensing/RosterRequests.aspx, чтобы выбрать параметры из переключателей, а затем нажать кнопку загрузки и получить файл.

I 'Я вполне уверен, что я правильно установил переключатели, но я не уверен, нажимаю ли я кнопку или, если да, то как определить начало загрузки, которая завершается обратной передачей (я думаю).

Я пытался дождаться Javascript, отключить Javascript, выполнить цикл в течение 60 секунд, проверяя contentType и создавая прослушиватель.

Я также подумал о том, чтобы загрузить форму со страницы, так как, возможно, действие HtmlUnit click () просто запускало Javascript и не выполняло действие post, но HtmlUnit не может найти форму на странице дажехотя он там есть.

public static void main( String[] args ) throws IOException, InterruptedException {
        WebClient webClient;
        webClient = new WebClient( BrowserVersion.FIREFOX_60 );                    

        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setUseInsecureSSL(true); 
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setSSLClientProtocols(new String[]{"TLSv1.2","TLSv1.1","TLSv1"});  
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());

        HtmlPage MainPage = (HtmlPage) webClient.getPage("https://www.pharmacy.ohio.gov/Licensing/RosterRequests.aspx");
        HtmlElement body = MainPage.getBody();
        if (dbg) System.out.println("MainPage = " + MainPage); 

\\ All of the below are empty:

        System.out.println( "MainPageForm = " + MainPage.getFirstByXPath( "//*[@id=\"form1\"]"));
        System.out.println( "Form List = " + MainPage.getElementsByIdAndOrName( "form#form1"));
        System.out.println( "Form List = " + MainPage.getForms());
        System.out.println( "Form? = " + MainPage.querySelector("#form1"));
        System.out.println( "Form? = " + MainPage.getFirstByXPath( "//form[@action=\"RosterRequests.aspx\"]" ));
        System.out.println( "Form? = " + MainPage.getElementById( "#form1"));
        System.out.println( "MainPageButton = " + MainPage.getFirstByXPath( "//*[@id=\"phBody_rblLicenseType_5\"]") );

\\ Code to click buttons: 

HtmlRadioButtonInput rad_status = (HtmlRadioButtonInput)MainPage.getHtmlElementById("phBody_rblLicenseStatus_1");
rad_status.setChecked( true );
HtmlRadioButtonInput rad_tddd = MainPage.getHtmlElementById( "phBody_rblLicenseType_1");
rad_tddd.setChecked( true );
HtmlInput btn_download = (HtmlInput)MainPage.getHtmlElementById( "phBody_btnSubmit" );   
WebResponse response = btn_download.click().getWebResponse();

\\ ContentType never changes 

        int tries = 30;

        while ( tries > 0 ) {
            //System.out.println( response.getWebRequest().toString());
            System.out.println( response.getContentType());
            synchronized (response) { response.wait(1000);}

        tries--;
        }

        webClient.close();


    }

Ничего не загружается и ContentType никогда не изменяется.В браузере инструменты разработчика показывают, что страница aspx перезагружается с другим ContentType, который вызывает диалог загрузки.

1 Ответ

0 голосов
/ 02 мая 2019

Это работает с HtmlUnit 2.36.0 (или, по крайней мере, с последней 2.35.0-SNAPSHOT.

final String url = "https://www.pharmacy.ohio.gov/Licensing/RosterRequests.aspx";

try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
    HtmlPage page = webClient.getPage(url);

    HtmlRadioButtonInput rad_status = (HtmlRadioButtonInput)page.getHtmlElementById("phBody_rblLicenseStatus_1");
    rad_status.setChecked( true );
    HtmlRadioButtonInput rad_tddd = page.getHtmlElementById( "phBody_rblLicenseType_1");
    rad_tddd.setChecked( true );

    HtmlInput btn_download = (HtmlInput)page.getHtmlElementById( "phBody_btnSubmit" );
    WebResponse response = btn_download.click().getWebResponse();

    try (InputStream in = response.getContentAsStream();
         FileOutputStream out = new FileOutputStream("c:/tmp/test.xlsx")) {
        byte[] buffer = new byte[8 * 1024];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }
    }
}
...