2013-03-24 71 views
1

在阅读此论坛一段时间,但刚刚注册,这是我的第一篇文章,所以在这里完成的伟大工作的荣誉。HtmlUnit问题与登录弹出

我正在用Java编写一个程序,目的是使用HtmlUnit连接到我所订阅的杂志之一,登录和搜索感兴趣的文章。一旦我得到这个工作,它会给我发一封电子邮件,但这与我的问题无关。

我不能登录工作:

  • 我读的页面
  • 查找登录按钮,点击它
  • 捕获结果在一个新的页面,提取表单和供应用户名/密码,最后
  • 点击登录按钮

如果你点击登录时,弹出来了。但我似乎无法捕捉弹出窗口。

这是我的代码:

public void authenticate() throws MalformedURLException, IOException 
{ 

    LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");  
    java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); 
    java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF); 

    WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_9); 
    webClient.getOptions().setJavaScriptEnabled(true); 
    webClient.getCookieManager().setCookiesEnabled(true); 
    webClient.getOptions().setThrowExceptionOnScriptError(false); 
    webClient.getOptions().setPopupBlockerEnabled(false); 

    webClient.addWebWindowListener(new WebWindowListener() 
    { 

      public void webWindowOpened(WebWindowEvent event) 

      { 
       System.out.println("a NEW window opened: " + event.getNewPage()); 
       windows.add(event.getWebWindow()); 

      } 

     @Override 
     public void webWindowClosed(WebWindowEvent event) { 
      System.out.println("a window is CLOSED: " + event.getOldPage()); 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void webWindowContentChanged(WebWindowEvent event) {} 

    }); 

    // Get the first page 
    HtmlPage page1 = webClient.getPage("**"); 
    HtmlDivision div = (HtmlDivision) page1.getElementById("topContainer"); 

    HtmlAnchor anchor = (HtmlAnchor) div.getElementById("loginBtn1");  
    HtmlPage logPage = (HtmlPage) anchor.click(); 
    System.out.println("logPage is: "+logPage); 

    if (windows.size() > 0) 
    { 
     System.out.println("YIOUHOUU"); 
      HtmlPage popupPage = getPopupPage(); 
      System.out.println(popupPage.getTitleText()); 
    } 

    HtmlForm form = logPage.getFormByName("loginForm"); 
    System.out.println("Form: "+ form); 

    HtmlTextInput username = form.getInputByName("username"); 
    HtmlPasswordInput password = form.getInputByName("password"); 
    HtmlCheckBoxInput rememberPassword = form.getInputByName("remember"); 
    HtmlCheckBoxInput acceptTerms = logPage.getElementByName("acceptTerms"); 
    HtmlAnchor button = form.getElementById("loginButton"); 

    username.setValueAttribute("USER"); 
    password.setValueAttribute("RANDOM_PASS"); 
    rememberPassword.setChecked(true); 
    acceptTerms.setChecked(true); 

    System.out.println(form.toString()); 

    HtmlPage page2 = button.click(); 
    System.out.println(page2.asText()); 
    webClient.closeAllWindows(); 
} 

我得到的登录页面,获取表单和供应等领域。所有这一切都完成了,但是当在第二页上并且点击登录时什么也没有发生。

即使您提交字段并单击SUbmit,也不会发生任何事情。我正在查看HTML页面的源代码,但无法弄清楚为什么,在背景中是否是ajax或其他?

预先感谢任何帮助

回答

0

**更新:给这个并解决了这个使用Selenium和他们webdriver的API,它使这个易如反掌。看起来Htmlunit不适合这种类型的任务,并且听取了我的建议并避免出于类似的目的。

1

对于弹出式登录框,您可以使用url传递用户名和密码。

如果您正在使用这个下面一行去那个登录页面:

String url = "http://example.com"; 
HtmlPage page = webClient.getPage(url); 

那么这个链接更改为以下之一,它应该工作:

String username = "YOUR USERNAME"; 
String password = "YOUR PASSWORD"; 
String url = "http://" + username + ":" + password + "@example.com"; 
HtmlPage page = webClient.getPage(url); 
+0

@blondeamon你可以请接受这个答案? – 2016-05-04 13:31:17