Это для моего рабочего проекта, поэтому я не могу быть таким конкретным, как хотелось бы.
Приложение Java, которое я разрабатываю, должно делать следующее:
- заполняет форму веб-страницы,
- кликает на отправку
- открывает новую страницу, на которой отображается успех/неудача
- через 5 секунд новая страница автоматически перенаправляет себя на другую страницу в зависимости от успеха/неудачи
- в результате база данных обновляется.
(веб-страницы уже существуют и настроены, как я описал здесь, и мое приложение должно обрабатывать их автоматически)
Я пытаюсь использовать HtmlUnit для обработки страниц, заполнения форм и нажатия кнопок.
Однако я получаю некоторые исключения, которых я хотел бы избежать, если это возможно.
1) когда я настраиваю свой веб-клиент так:
wc = new WebClient();
wc.setJavaScriptEnabled(false);
Код делает то, что должен, но выдает это исключение:
dec 09, 2015 5:28:37 PM com.gargoylesoftware.htmlunit.WebClient printContentIfNecessary
INFO: statusCode=[400] contentType=[]
dec 09, 2015 5:28:37 PM com.gargoylesoftware.htmlunit.WebClient printContentIfNecessary
INFO:
com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException: 400 Bad Request for http://www.booking.com/flexiproduct.html
at com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java:540)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:360)
at com.gargoylesoftware.htmlunit.html.BaseFrame.loadInnerPageIfPossible(BaseFrame.java:136)
at com.gargoylesoftware.htmlunit.html.BaseFrame.loadInnerPage(BaseFrame.java:109)
at com.gargoylesoftware.htmlunit.html.HtmlPage.loadFrames(HtmlPage.java:1527)
at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:138)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:461)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
at com.gargoylesoftware.htmlunit.ImmediateRefreshHandler.handleRefresh(ImmediateRefreshHandler.java:83)
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeRefreshIfNeeded(HtmlPage.java:1093)
at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:145)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:461)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:382)
at com.gargoylesoftware.htmlunit.html.HtmlForm.submit(HtmlForm.java:242)
at com.gargoylesoftware.htmlunit.html.HtmlImageInput.doClickAction(HtmlImageInput.java:150)
at com.gargoylesoftware.htmlunit.html.ClickableElement.click(ClickableElement.java:148)
at com.gargoylesoftware.htmlunit.html.ClickableElement.click(ClickableElement.java:109)
at com.gargoylesoftware.htmlunit.html.ClickableElement.click(ClickableElement.java:87)
at com.gargoylesoftware.htmlunit.html.HtmlImageInput.click(HtmlImageInput.java:175)
at com.gargoylesoftware.htmlunit.html.HtmlImageInput.click(HtmlImageInput.java:132)
at paymentproviders.PProvider.submitForm(PProvider.java:52)
at paymentproviders.APXProvider.completeTransaction(APXProvider.java:114)
at workApps.Lazaruss1.App.main(App.java:80)
Код работает, база успешно обновляется, но на последнем редиректе происходит сбой и не открывается конечная страница. :(
2) когда я настраиваю веб-клиент как таковой:
wc.setThrowExceptionOnFailingStatusCode(false);
Я получаю следующее исключение, и программа не работает:
dec 09, 2015 5:31:12 PM com.gargoylesoftware.htmlunit.WebClient printContentIfNecessary
INFO: statusCode=[400] contentType=[]
dec 09, 2015 5:31:12 PM com.gargoylesoftware.htmlunit.WebClient printContentIfNecessary
INFO:
Failed to read the SOAP message.
java.lang.RuntimeException: Refresh Aborted by HtmlUnit: Attempted to refresh a page using an ImmediateRefreshHandler which could have caused an OutOfMemoryError Please use WaitingRefreshHandler or ThreadedRefreshHandler instead.
at com.gargoylesoftware.htmlunit.ImmediateRefreshHandler.handleRefresh(ImmediateRefreshHandler.java:81)
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeRefreshIfNeeded(HtmlPage.java:1093)
at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:145)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:461)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
at com.gargoylesoftware.htmlunit.ImmediateRefreshHandler.handleRefresh(ImmediateRefreshHandler.java:83)
at com.gargoylesoftware.htmlunit.html.HtmlPage.executeRefreshIfNeeded(HtmlPage.java:1093)
at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:145)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:461)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:359)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:382)
at com.gargoylesoftware.htmlunit.html.HtmlForm.submit(HtmlForm.java:242)
at com.gargoylesoftware.htmlunit.html.HtmlImageInput.doClickAction(HtmlImageInput.java:150)
at com.gargoylesoftware.htmlunit.html.ClickableElement.click(ClickableElement.java:148)
at com.gargoylesoftware.htmlunit.html.ClickableElement.click(ClickableElement.java:109)
at com.gargoylesoftware.htmlunit.html.ClickableElement.click(ClickableElement.java:87)
at com.gargoylesoftware.htmlunit.html.HtmlImageInput.click(HtmlImageInput.java:175)
at com.gargoylesoftware.htmlunit.html.HtmlImageInput.click(HtmlImageInput.java:132)
at paymentproviders.PProvider.submitForm(PProvider.java:52)
at paymentproviders.APXProvider.completeTransaction(APXProvider.java:114)
at workApps.Lazaruss1.App.main(App.java:80)
После этого код завершает работу, и база данных не изменяется.
Я хочу полностью исключить эти исключения. Как мне настроить WebClient, чтобы он перестал вести себя как такой придурок?