无法使用HtmlUnit 2.35.0登录网站

时间:2019-05-19 04:25:39

标签: java login htmlunit

我想使用HtmlUnit登录到https://www.rjs.com/member/user.html#login,但失败了,在调用登录按钮后,仍然可以返回上一页。

如果有人能在这个问题上帮助我,将不胜感激。

WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.setCssErrorHandler(new SilentCssErrorHandler()); 
webClient.getOptions().setUseInsecureSSL(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setTimeout(50000);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setRedirectEnabled(true); 
webClient.getCookieManager().setCookiesEnabled(true); 
HtmlPage page = webClient.getPage("https://www.rjs.com/member/user.html#login");
webClient.waitForBackgroundJavaScript(10000);
System.out.println(page.asXml());
HtmlInput heUsername = (HtmlInput)page.getHtmlElementById("login_username");
HtmlPasswordInput hePassword = (HtmlPasswordInput)page.getHtmlElementById("login_pwd");
HtmlButton heLogin = (HtmlButton)(page.getFirstByXPath("//button[@class='login-btn']"));
heUsername.setValueAttribute(<my user name>);
hePassword.setValueAttribute(<my password>);
HtmlPage page2 = heLogin.click();
webClient.waitForBackgroundJavaScript(10000);
System.out.println(page2.asXml());
webClient.close();

2 个答案:

答案 0 :(得分:0)

没有凭据,我无法验证您的问题。只有一些一般提示

  1. 使WebClient设置尽可能简单,默认值通常很好。从我的角度来看,您只需要

    webClient.getOptions().setUseInsecureSSL(true);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    
  2. 使用type()填充输入字段

    heUsername.type(<my user name>);
    hePassword.type(<my password>);
    
  3. 如果您在登录后等待js完成,通常最好从窗口中获取页面,因为js在登录后可能已加载了另一个页面。

    HtmlPage page2 = heLogin.click();
    webClient.waitForBackgroundJavaScript(10000);
    page2 = ((HtmlPage) page2.getEnclosingWindow().getEnclosedPage());
    

希望有帮助。而且一如既往,日志中也包含有用的提示。

答案 1 :(得分:0)

这似乎在这里有效(使用最新的2.36.0-SNAPSHOT)。

public static void main(String[] args) throws Exception {
    String uri = "https://www.rjs.com/member/user.html#login";

    try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
        HtmlPage page = webClient.getPage(uri);
        webClient.waitForBackgroundJavaScript(10000);

        HtmlInput heUsername = (HtmlInput) page.getHtmlElementById("login_username");
        HtmlPasswordInput hePassword = (HtmlPasswordInput) page.getHtmlElementById("login_pwd");
        HtmlButton heLogin = (HtmlButton) page.getFirstByXPath("//button[@class='login-btn']");
        heUsername.type(....);
        hePassword.type(....);

        heLogin.click();
        webClient.waitForBackgroundJavaScript(10000);

        page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
        System.out.println("----------------");
        System.out.println(page.asXml());
    }
}