问题描述
环境的配置如下。
java 1.8 htmlunit 2.43
_webClient = new WebClient(browserVersion.FIREFOX);
// ajax,javaScript controller
_webClient.setAjaxController(new NicelyResynchronizingAjaxController());
// set options
_webClient.getoptions().setJavaScriptEnabled(true);
_webClient.getoptions().setCssEnabled(false);
_webClient.getoptions().setUseInsecureSSL(true);
_webClient.getoptions().setSSLClientProtocols( _webClient.getoptions().getSSLClientProtocols() );
//_webClient.getoptions().setSSLClientProtocols(new String[] {"TLSv1.2","TLSv1.1","TLSv1" });
_webClient.getoptions().setRedirectEnabled(true);
_webClient.getoptions().setPopupBlockerEnabled(false);
_webClient.getoptions().setThrowExceptionOnScriptError(false);
_webClient.getoptions().setThrowExceptionOnFailingStatusCode(false);
_webClient.getoptions().setPrintContentOnFailingStatusCode(false);
_webClient.waitForBackgroundJavaScript(10000);
// set timeouts
_webClient.getoptions().setTimeout( timeout *1000 );
_webClient.setJavaScriptTimeout( timeout *1000 );
_webClient.waitForBackgroundJavaScript( timeout *500 );
//_webClient.getJavaScriptEngine().setJavaScriptTimeout( timeout *1000 );
_webClient.waitForBackgroundJavaScriptStartingBefore(timeout *1000);
_webClient.getCookieManager().setCookiesEnabled(true);
以上是我的环境。
下面是我要单击的HTML元素。
<div class="btnConfirmWrap">
<button data-v-ffa8b1e8=""
class="hasBgColor bgColorRed roundType sizeMedium alignLeft">
<span data-v-ffa8b1e8="" class="inner"> <!----> <span
data-v-ffa8b1e8="" class=""> Login </span>
<!----></span>
</button>
</div>
这是单击上面提到的html元素的代码。 XPath的内容是通过访问Chrome获得的网页的fullXpath。 我自己检查了XPath路径。 XPath没错。
hElement = getByXPathFirstElement( _htmlPage,"/html/body/div[1]/main/div/div[1]/div/div[4]/button");
Page page = hElement.click();
_htmlPage = (HtmlPage) page;
System.out.println(_htmlPage.asText());
在单击登录按钮之前,我检查_htmlPage.asText()是否具有ID和PW值。 但是,如果单击该按钮,则不会执行登录按钮功能,并且ID和PW值会丢失。 ID和密码是正确的值。 无法登录,帮帮我 如果您直接访问该站点并登录,则效果很好。但是htmlunit不起作用。我的代码有什么问题?
解决方法
没有重现方式,我只能提供一些提示:
像往常一样检查日志,也许有提示...。
这两个功能不是选项
_webClient.waitForBackgroundJavaScript( timeout *500 );
_webClient.waitForBackgroundJavaScriptStartingBefore(timeout *1000);
开始操作后(例如,单击后),您必须给他们打电话
Page page = hElement.click();
_htmlPage = (HtmlPage) page;
您的代码会通过点击获得您的同步结果页面。但是,也许您单击会强制执行某些js操作,或者该操作是异步操作,并且可能会强制执行页面替换。您可以尝试执行以下操作:
- 强制点击
- 等待后台js
- 通过向页面询问当前窗口,然后向窗口询问所附页面来获取当前窗口内容
也许有帮助。
如果不尝试构建可复制的样本并在github上发布问题。