Отправка формы HtmlUnit, так как кнопка не имеет прямой гиперссылки - PullRequest
0 голосов
/ 30 января 2019

У меня есть кнопка на странице, но в ней нет гиперссылки.Поэтому мне нужно отправить форму, чтобы перейти на следующую страницу.

HtmlUnit не ожидает загрузки следующей страницы.Таким образом, переменная nextPage имеет текущую страницу вместо следующей (хотя периодически она работает, если страница загружается достаточно быстро).Как решить эту проблему?

HTML-страница:

    <form action="/webapp/NewPage.jsp" id="idForm01" accept-charset="UNKNOWN" onsubmit="return false;" 
    name="frmNewPageForm" method="post" enctype="application/x-www-form-urlencoded">
                   <input name="attribute1" type="HIDDEN" value="1">

                   <input id="attribute2" value="EDIT_ATTRIBUTE2" name="functionalAttribute" type="hidden">

                </form>


                <table id="idTablePageDetails" class="formTable">

                   <tbody>
                    <tr class="formHeaderRow">
                      <td colspan="4" nowrap="">
                         Page Details

                         <a onclick="onClick_newPageButton();return false;" id="newPageButton" title="New Page" href="#" class="smallButton">
        <img id="image" border="0" class="smallButtonImg" src="/webapp/image/imageButton.png"></a>

                         <script type="text/javascript" language="Javascript">
                        <!--
                        function onClick_newPageButton() {
                           buttonAction_newPageButton();
                        }
                        function buttonAction_newPageButton() {   
            if ( allowClick() == true ) { addFormField( "frmNewPageForm", "action", "ACTION_NEW_PAGE" );
            if ( document.frmNewPageForm.onsubmit != null ) { document.frmNewPageForm.onsubmit(); }document.frmNewPageForm.submit(); }}
                        // -->
                        </script>

</table>

Код, который я использую для перехода на следующую страницу:

HtmlPage nextPage = (HtmlPage) page.executeJavaScript("document.frmNewPageForm.onsubmit()").getNewPage(); // from onsubmit

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Почему вы нажимаете на кнопки или выполняете JavaScript вместо выполнения запросов?Я думаю, что это более надежно

0 голосов
/ 31 января 2019

Ваше наблюдение является результатом распространенного на сегодняшний день подхода на основе одной страницы на основе ajax / async / javascript для веб-приложений.

Вы можете использовать такой кодовый шаблон

    ... find the clickable element...
    myBtn.click();
    webClient.waitForBackgroundJavaScript(10000);

    HtmlPage resultPage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();

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

Существует также метод waitForJobsStartingBefore (), если вы хотите иметь больше контролячерез время ожидания.Оба метода возвращаются до заданного периода времени в случае, если больше нет отложенного задания javascript.Для получения более подробной информации взгляните на javadoc и код.

Если вы хотите взглянуть на более изощренное использование API, вы можете взглянуть на Wetator (https://www.wetator.org/) sourceкод. Хорошей отправной точкой является класс HtmlUnitBrowser (https://wetator.repositoryhosting.com/trac/wetator_wetator/browser/trunk/wetator/src/org/wetator/backend/htmlunit/HtmlUnitBrowser.java)

Надеюсь, что поможет.

0 голосов
/ 30 января 2019

Добавьте любые атрибуты к форме, если вам нужно использовать NameValuePair.

Затем вызовите onSubmit () и затем Submit ()

HtmlPage nextPage1 = (HtmlPage) page.executeJavaScript("document.frmNewPageForm.onsubmit()").getNewPage(); // from onsubmit
HtmlPage nextPage2 = (HtmlPage) nextPage1.executeJavaScript("document.frmNewPageForm.submit()").getNewPage(); // from submit
...