Как вызвать метод 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-адрес, с которым вы работаете, чтобы мы могли воспроизвести / отладить ваше дело.