由于按钮没有直接超链接,因此提交HtmlUnit表单

时间:2019-01-30 10:11:28

标签: htmlunit

我在页面上有一个按钮,但是按钮中没有超链接。因此,我需要提交表单以转到下一页。

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 :(得分:1)

您的观察是当今基于Web应用程序的基于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/)源代码。一个很好的起点是类HtmlUnitBrowser(https://wetator.repositoryhosting.com/trac/wetator_wetator/browser/trunk/wetator/src/org/wetator/backend/htmlunit/HtmlUnitBrowser.java

希望有帮助。

答案 1 :(得分:0)

如果需要使用NameValuePair,请将所有属性附加到表单。

然后调用onSubmit(),然后再提交()

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

答案 2 :(得分:0)

为什么您要点击按钮或执行JavaScript而不是请求?我认为这更值得信赖