我在页面上有一个按钮,但是按钮中没有超链接。因此,我需要提交表单以转到下一页。
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
答案 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而不是请求?我认为这更值得信赖