Как вызвать метод post после установки значения формы для очистки экрана с помощью Java

Предыстория: у меня есть веб-страница (.aspx), в которой есть несколько раскрывающихся списков. Значение списка заполняется с помощью вызова Ajax на основе выбора предыдущего раскрывающегося списка. После выбора значения всех выпадающих списков мы можем нажать кнопку загрузки, и данные будут загружены на основе загруженных данных, которые нам нужны для выполнения некоторых других операций.

что я уже сделал: я могу установить выпадающие данные с помощью правильного вызова ajax, но отправка почтового запроса является проблемой. Вот фрагмент кода / псевдо-код.

Не стесняйтесь использовать любой инструмент вместе с Java

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


        WebRequest request = new WebRequest(new URL(DataDownloader.MY_URL),HttpMethod.POST);

        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.setJavaScriptTimeout(10000);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        webClient.getOptions().setTimeout(10000);

        HtmlPage page = webClient.getPage(request);     

        HtmlSelect firstDd = (HtmlSelect) page.getElementById("dd1_id");
        List<HtmlOption> firstOption = firstDd.getOptions();
        firstDd.setSelectedAttribute(firstOption.get(2), true);
        webClient.waitForBackgroundJavaScript(3000);

        HtmlPage pgAfterFirstDd = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
        HtmlSelect secondDd = (HtmlSelect) pgAfterFirstDd.getElementById("dd2_id");

        List<HtmlOption> secondOption = secondDd.getOptions();
        secondDd.setSelectedAttribute(secondOption.get(2), true);
        webClient.waitForBackgroundJavaScript(10000);
        //set the value for all other dropdowns


        HtmlPage finalpage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();         
        HtmlForm form = finalpage.getHtmlElementById("aspnetForm");
        webClient.waitForBackgroundJavaScript(10000);


        request.setRequestBody("REQUESTBODY");
        Page redirectPage = webClient.getPage(request);

//       HtmlSubmitInput submitInput=form.getInputByName("btnSubmit");
//      submitInput.click();
        /*HtmlButton submitButton = (HtmlButton) pageAfterWard.createElement("btnSubmit");
        submitButton.setAttribute("type", "submit");
        form.appendChild(submitButton);

        HtmlPage nextPage = (HtmlPage) submitButton.click();*/
    }

3 ответа

Решение

Почему вы скрываете свои ошибки? Есть ли секрет? Если вам нравятся полезные ответы, вы должны предоставить как можно больше информации. Так что я делаю дикое предположение...

submitInput.click();

вернет PDF. В этом случае вы должны сделать что-то вроде

Page pdfPage = submitInput.click();
WebResponse resp = pdfPage.getWebResponse();
if("application/pdf".equals(resp.getContentType())) {
    .... process the bytes
    .... resp.getContentAsStream()
}

HtmlUnit имеет четыре вида страниц: HtmlPage/XmlPage/TextPage и UnexpectedPage. Двоичный контент, такой как PDF или офисные документы, обрабатывается как UnexpectedPage. Обработка этого контента зависит от вас.

Как вы упомянули в комментарии в ответе RBRi, что вы получили ошибку при типизации.

  • какую именно ошибку вы получили
  • какой тип файла / ответ вы ожидали.

Потому что код выглядит хорошо для меня, и он должен работать отлично..

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);

Похоже, вы используете старую версию, пожалуйста, используйте самую последнюю.

WebRequest request = new WebRequest(new URL(DataDownloader.MY_URL),HttpMethod.POST);

С HtmlUnit вы обычно не работаете с запросами. Идея состоит в том, чтобы работать как браузер. Используйте что-то вроде getPage(окончательный URL-адрес).

List<HtmlOption> firstOption = firstDd.getOptions();
firstDd.setSelectedAttribute(firstOption.get(2), true);

Сделайте свою работу более похожей на браузер

firstOption.get(2)setSelected(true);

Это сделает всю фоновую работу за вас, как отмена выбора других опций и обработка событий для вас.

Относительно отправки формы ваша идея

 HtmlSubmitInput submitInput=form.getInputByName("btnSubmit");
 HtmlPage nextPage = submitInput.click();

выглядит правильно. Возможно, вам придется подождать и после этого. Если у вас все еще есть проблемы, вы должны предоставить URL-адрес, с которым вы работаете, чтобы мы могли воспроизвести / отладить ваше дело.

Другие вопросы по тегам