HtmlUnit表单提交后未等待页面加载,如何获取正确下一页?
解决HtmlUnit获取下一页时总是返回当前页的问题
我之前也碰到过HtmlUnit处理这种表单提交跳转的坑,你说的情况太典型了——按钮没有直接跳转链接,全靠JS触发表单提交,结果调用onsubmit()总是拿不到下一页,只有页面秒加载时偶尔正常。先梳理下你提供的代码和页面结构:
页面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();
问题根源
你现在的写法直接调用了onsubmit(),但看表单的onsubmit属性是return false;——这意味着执行这个函数只会返回false,不会触发表单的提交动作!而真正的提交逻辑是在按钮的点击函数里:先调用onsubmit()做验证,然后手动调用document.frmNewPageForm.submit()提交表单。你跳过了后面的submit步骤,自然页面不会跳转,拿到的还是当前页。
解决办法
给你两个靠谱的方案,选哪个都行:
方案一:模拟点击按钮(最贴近用户真实操作)
直接找到页面上的按钮元素,调用它的click()方法,这样会完整触发JS里的所有流程:
// 获取按钮元素 HtmlAnchor newPageButton = page.getAnchorById("newPageButton"); // 模拟点击,自动触发后续的JS逻辑和表单提交 HtmlPage nextPage = newPageButton.click();
方案二:直接调用按钮的点击函数
如果元素查找有问题,也可以直接执行按钮对应的点击JS函数,然后等待页面加载完成:
// 执行按钮的点击函数 page.executeJavaScript("onClick_newPageButton()"); // 获取WebClient实例,等待后台JS执行完成(时间可以根据页面实际加载速度调整) WebClient webClient = page.getWebClient(); HtmlPage nextPage = (HtmlPage) webClient.waitForBackgroundJavaScript(5000); // 或者强制等待页面跳转 webClient.waitForBackgroundJavaScriptStartingBefore(5000); nextPage = webClient.getCurrentWindow().getEnclosedPage();
额外注意点
- 确保HtmlClient启用了JavaScript支持(默认是启用的,但如果之前禁用了要打开):
webClient.getOptions().setJavaScriptEnabled(true); - 如果页面有
allowClick()这种验证函数,要确保它返回true,不然提交逻辑会被阻断。可以提前执行JS修改这个函数的返回值,比如page.executeJavaScript("allowClick = function(){return true;}");
内容的提问来源于stack exchange,提问作者firstpostcommenter
相关产品推荐
相关产品推荐

