登录弹出窗口的HtmlUnit问题

时间:2013-03-24 05:40:03

标签: java 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还是其他?

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:1)

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

如果您使用以下这一行进入该登录页面:

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);

答案 1 :(得分:0)

**更新:使用Selenium和他们的WebDriver API解决了这个问题,这使得这很简单。似乎Htmlunit不适合这类任务,并听取我的意见并避免出于类似目的。