1

このフォーラムをしばらく読んでいましたが、サインアップしたばかりです。これは私の最初の投稿です。ここで素晴らしい仕事をしたことを称賛します。

HtmlUnit を使用して、購読している雑誌の 1 つに接続し、ログインして興味のある記事を検索する目的で、Java でプログラムを作成しています。それが機能すると、メールが送信されますが、それは私の質問には関係ありません。

ログインが機能しません:

  • ページを読みました
  • ログインボタンを見つけてクリックします
  • 新しいページで結果を取得し、フォームを抽出してユーザー名とパスワードを入力し、最後に
  • ログインボタンをクリック

ログインをクリックすると、ポップアップが表示されます。しかし、ポップアップをキャプチャできないようです。

これは私のコードです:

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

ログインページを取得し、フォームを取得してフィールドを提供します。これですべて完了ですが、2 ページ目でログインをクリックしても何も起こりません。

フィールドを送信して [送信] をクリックしても、何も起こりません。HTML ページのソースを見ていますが、理由がわかりません。バックグラウンドで ajax か sth ですか?

助けてくれてありがとう

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 に答える