1

阅读这个论坛有一段时间了,但刚刚注册,这是我的第一篇文章,非常感谢这里所做的出色工作。

我正在用 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();
}

我得到登录页面,获取表单并提供字段。所有这一切都完成了,但是在第二页并单击登录时没有任何反应。

即使您提交字段并单击提交,也没有任何反应。我正在查看 html 页面的源代码,但不知道为什么,它是 ajax 还是后台的其他东西?

提前感谢您的帮助

4

2 回答 2

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);
于 2015-05-06T17:41:31.150 回答
0

** 更新:放弃并使用 Selenium 和他们的 WebDriver API 解决了这个问题,这让这变得很容易。似乎 Htmlunit 不适合此类任务,请听从我的建议并避免出于类似目的使用它。

于 2013-04-09T10:42:30.747 回答