8

我对 HtmlUnit 非常陌生。我想知道我是否能够使用 htmlunit 登录到站点并在站点中执行一些操作,例如我想登录到我的办公室门户并请假。

我正在使用 html 单元,它显示了一些错误,它可能与 html 单元有关,还是有任何其他工具可以用于此目的......
这是我的代码

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);        
webClient.setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);

final HtmlPage page1 =  webClient.getPage("http://www.ccstechnologies.org/login.aspx/");
final HtmlForm form = page1.getFormByName("form1");         
final HtmlSubmitInput button =  form.getInputByName("BtnLogin");
final HtmlTextInput textField =  form.getInputByName("Username");
final HtmlPasswordInput pwd =  form.getInputByName("password");        
textField.setValueAttribute("username");
pwd.setValueAttribute("password");      

final HtmlPage page2 =  button.getEnclosingForm().click();  
String htmlBody = page2.getWebResponse().getContentAsString(); 

System.out.println("Base Uri 1 : "+page1);
System.out.println("Base Uri 2 : "+page2);

webClient.closeAllWindows();

但是当我打印page2它时,它只显示登录页面的 url,而不是返回主页 url。可能是什么问题呢 ?

这是我在单击表单时在控制台中得到的

2012 年 5 月 28 日上午 11:44:15 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl 通知警告:遇到过时的内容类型:'application/x-javascript'。2012 年 5 月 28 日上午 11:44:16 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl 通知警告:遇到过时的内容类型:'application/x-javascript'。基本 Uri 1:HtmlPage(http://www.ccstechnologies.org/login.aspx/)@2741851 基本 Uri 2:HtmlPage(http://www.ccstechnologies.org/login.aspx/)@2741851

单击按钮时生成的结果

May 29, 2012 10:00:02 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
May 29, 2012 10:00:02 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'text/javascript'.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error
WARNING: CSS error: [259:24] Error in expression. Invalid token "=". Was expecting one of: <S>, <COMMA>, "/", <PLUS>, "-", <HASH>, <STRING>, ")", <URI>, "inherit", <EMS>, <EXS>, <LENGTH_PX>, <LENGTH_CM>, <LENGTH_MM>, <LENGTH_IN>, <LENGTH_PT>, <LENGTH_PC>, <ANGLE_DEG>, <ANGLE_RAD>, <ANGLE_GRAD>, <TIME_MS>, <TIME_S>, <FREQ_HZ>, <FREQ_KHZ>, <DIMENSION>, <PERCENTAGE>, <NUMBER>, <FUNCTION>, <IDENT>.
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error
WARNING: CSS error: [259:29] Error in style rule. Invalid token "\r\n   ". Was expecting one of: "}", ";".
May 29, 2012 10:00:03 AM com.gargoylesoftware.htmlunit.DefaultCssErrorHandler warning
WARNING: CSS warning: [259:29] Ignoring the following declarations in this rule.
HtmlPage(http://192.168.0.5/login.aspx)@23511316
HtmlPage(http://192.168.0.5/login.aspx)@17700115
4

4 回答 4

4

好的,我调查了一下,似乎问题出在按钮上。我用这个替换了你的按钮代码行:

 final HtmlPage page2 =  (HtmlPage) form.getInputByValue("Login").click();

现在看来它至少尝试登录(并且页面当然会打印无效登录),因此它应该使用适当的凭据。在 java 中打印页面并查看它使用 system.out.println(page1.asText()) 或 asXml 取决于你想看到什么

我的代码终于是这样的:

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);         
        webClient.setJavaScriptEnabled(true);
        webClient.getCookieManager().setCookiesEnabled(true);


     try{   final HtmlPage page1 =  webClient.getPage("http://www.ccstechnologies.org/login.aspx/");
        final HtmlForm form = page1.getFormByName("form1");         
        final HtmlSubmitInput button =  form.getInputByName("BtnLogin");
        final HtmlTextInput textField =  form.getInputByName("Username");
        final HtmlPasswordInput pwd =  form.getInputByName("password");        
        textField.setValueAttribute("username");
        pwd.setValueAttribute("password");      
System.out.println(page1.asText());
        final HtmlPage page2 =  (HtmlPage) form.getInputByValue("Login").click();

        String htmlBody = page2.getWebResponse().getContentAsString(); 
        System.out.println(page2.asText());
       System.out.println("Base Uri 1 : "+page1);
      System.out.println("Base Uri 2 : "+page2);

        webClient.closeAllWindows();}catch (Exception e) {
            // TODO: handle exception
        }
于 2012-05-28T08:50:29.313 回答
3

这是您应该为 javascript 设置的内容:

webClient.getOptions().setJavaScriptEnabled(false);

您也可以将这些添加到其中。

webClient.getOptions().setRedirectEnabled(true);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setUseInsecureSSL(true);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getCookieManager().setCookiesEnabled(true);

这应该像对我一样解决问题。

于 2013-11-26T13:34:21.730 回答
1

如果网站使用 ajax 调用登录。这对我有用。设置这个

webClient.setAjaxController(new NicelyResynchronizingAjaxController());

这将导致所有 ajax 调用都是同步的。

这就是我设置 WebClient 对象的方式

WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getCookieManager().setCookiesEnabled(true);
于 2014-07-18T09:59:10.403 回答
1

尝试设置cookies启用,并尝试设置javascript启用忽略它可能打印的错误......(我曾经认为红色的错误是坏的,在html单元中似乎不一定)

于 2012-05-27T18:37:49.883 回答