HtmlUnit FailingHttpStatusCodeException: 400 неверный запрос

Это для моего рабочего проекта, поэтому я не могу быть таким конкретным, как хотелось бы.

Приложение 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, чтобы он перестал вести себя как такой придурок?


person Lazaruss    schedule 10.12.2015    source источник
comment
Обновить — кнопка отправки не ‹input type=submit›, а представляет собой изображение. Я нажимаю на него, используя следующий код:   -  person Lazaruss    schedule 10.12.2015
comment
page = (HtmlPage) ((ClickableElement) form.getFirstByXPath(nameValues.get(submitXPath))).click();   -  person Lazaruss    schedule 10.12.2015


Ответы (2)


Больше информации :

это форма начальной страницы:

 <form id="paymentPageData" action="processConfirmPaymentPage" method="post">

                    <div style="display: none;">
                        <input id="transactionId" name="tranId" type="hidden" value="1510351"/>
                        <input id="cashAmount" name="amount" type="hidden" value="5.43"/>
                        <input id="usedCurrency" name="currency" type="hidden" value="EUR"/>
                        <input id="merchantRef" name="merchantTxRef" type="hidden" value="83002679818"/>
                        <input id="digestKey" name="digest" type="hidden" value="aa76e7f0db12ddbe86c1d3e13fd512e70ccfa535fbd93a347cbe2847c6187aca"/>
                        <input id="cssUrl" name="cssUrl" type="hidden" value=""/>
                    </div>

                    <div>
                        <input type="image" name="confirm" src="common/images/confirm-ukash_en_GB.jpg" border="0">
                    </div>
                    <div>
                        <input type="image" name="reverse" src="common/images/cancel-ukash_en_GB.jpg" border="0">
                    </div>

                </form>

Это страница, которую открывает кнопка успеха:

<link rel="stylesheet" type="text/css" href="">


    <meta http-equiv="refresh" content="3;url=http://www.b92.net?Operation.ResultMessage=Success&amp;DigestKey=05980b62080143b0e9c1d56b304425cde3bd4acd1277c759bad007fb5eba5f95&amp;Merch.ID=78700005&amp;Processor.Response=00&amp;Account.Num=00000007&amp;Tran.Ref=83002679818&amp;OperationResult=SUCCESS&amp;Operation.Currency=EUR&amp;Operation.Amount=543&amp;Operation.Date=2015-12-10T10:29:26Z&amp;Transaction.Auth=01234&amp;Merchant.TxReference=83002679818">

</head>

<body>
    <div id="page">
        <div id="redirectPage">
            <div id="successfulRedirectPage">
                <div id="header"></div>
                <div id="left"></div>
                <div id="centre">
                    <div id="successfulHeader">
                        Your payment was successful
                    </div>
                    <div id="successfulMessage">
                        You will shortly be redirected back to the original site. Or, simply click the link below.
                    </div>
                    <div id="successfulLink">

                            <a href="http://www.b92.net?Operation.ResultMessage=Success&amp;DigestKey=05980b62080143b0e9c1d56b304425cde3bd4acd1277c759bad007fb5eba5f95&amp;Merch.ID=78700005&amp;Processor.Response=00&amp;Account.Num=00000007&amp;Tran.Ref=83002679818&amp;OperationResult=SUCCESS&amp;Operation.Currency=EUR&amp;Operation.Amount=543&amp;Operation.Date=2015-12-10T10:29:26Z&amp;Transaction.Auth=01234&amp;Merchant.TxReference=83002679818">Return</a>

                    </div>
                </div>
                <div id="right"></div>
                <div id="footer"></div>
            </div>
        </div>
    </div>
</body>

(я изменил названия свойств, чтобы защитить конфиденциальность моего работодателя)

person Lazaruss    schedule 10.12.2015
comment
Я думаю, что отключение JavaScript в моем веб-клиенте предотвращает это перенаправление. Но если я оставлю его включенным, я получу огромное исключение, которое слишком велико для консоли. - person Lazaruss; 10.12.2015

Я решил проблему :)

Страница, которую вело обновление, была СЛИШКОМ БОЛЬШОЙ и не могла поместиться в объект страницы.

Я изменил URL-адрес перенаправления на: https://login.live.com/

И это работает сейчас.

person Lazaruss    schedule 10.12.2015