1

JAVA経由でWebサイトにログインしたい。

認証: サイトには、ホームページへのリダイレクトを実行する JavaScript ボタンがあります。私の Web クローラーは、Jsoup を使用して、html ボタンを持つサイトにプログラムでログインできます。しかし、javascript で送信する Web サイトにログインしようとすると、これまでに発見したどの方法でも認証されないようです。

これまでのところ、私は試しました:

  • URLConnection と OutputWriter を使用して、ネイティブの Java API を使用してログインしようとしました。ユーザーとパスワードのフィールドに適切な値が入力されますが、javascript メソッドを実行しようとすると、単に機能しません。
  • スープ。(html ボタンを含む任意の Web サイトにログインできます。ただし、javascript をサポートしていないため、あまり役に立ちません。
  • 私は HtmlUnit を試しました。膨大な行数の出力を出力するだけでなく、実行に長い時間がかかり、最終的には依然として失敗します。
  • 最後に、Rhino (HtmlUnit が基づいている) を使用してみましたが、JavaScript メソッドの長いリストで動作するようになりました。ただし、認証できません。
  • 私はすでにSeleniumを試しましたが、どこにも行きません..

アイデアが尽きた..おそらく、これらの API の 1 つに含まれるすべてのソリューションを調査したわけではありませんが、JavaScript ボタンを含む Web サイトにまだログインできません。誰にもアイデアはありますか?

4

3 に答える 3

3

Selenium Webdriverを使用して、javascript コマンドをブラウザに送信します。私はそれを使用して、クライアント上の複雑な javascript/ajax 手順で何百ものテストを確実かつ繰り返し実行することに成功しました。

特定の Web ページを対象とする場合は、スクリプトをカスタマイズして非常に小さくすることができます。

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;

// This is javascript, but can be done through Webdriver directly
js.executeScript("document.getElementById('theform').submit();");

フォームへの入力は、 Selenium Webdriver APIを使用して処理されたと想定されます。click()コマンドを右ボタンなどに送信することもできます。

Selenium Webdriver を使用<script>すると、より大きなライブラリをロードするために、ブラウザにタグを書き込むこともできます。ブラウザがスクリプト ファイルをロードするまで待機/スリープする必要がある場合があることに注意してください。これは、独自のスクリプト ファイルと、元の Web ページがログイン手順に使用するファイルの両方です。すべてを読み込んで実行するのに数秒かかる場合があります。スリープ状態が長くなりすぎないようにするには、他のすべてがロードされているかどうかをチェックする小さなスクリプトを挿入する、より信頼性の高い方法を使用します (Web ページ スクリプトのステータス フラグ、ブラウザのステータスをチェックします)。

于 2012-06-15T18:32:33.720 に答える
1

HtmlUnitをお勧めします:

HtmlUnitは、「Javaプログラム用のGUIレスブラウザ」です。HTMLドキュメントをモデル化し、「通常の」ブラウザの場合と同じように、ページの呼び出し、フォームへの入力、リンクのクリックなどを可能にするAPIを提供します。

かなり優れたJavaScriptサポート(常に改善されています)を備えており、非常に複雑なAJAXライブラリでも機能し、使用する構成に応じてFirefoxまたはInternetExplorerのいずれかをシミュレートします。

これは通常、テスト目的またはWebサイトから情報を取得するために使用されます。

于 2012-06-16T02:46:12.273 に答える
0

似たような問題がありました (javascript メソッドを呼び出すログイン ボタンがありました)。

私は JMeter を使用して、Web ブラウザーからログイン ボタンを手動でクリックしたときに何が渡されたかを観察しました (ただし、これは WireShark でも同様に実行できると思います)。

私の Java コードでは、送信されるすべてのパラメーターを使用して PostMethod を作成しました。

PostMethod post = new PostMethod(WEB_URL); // URL of the login page
// first is the name of the field on the login page,
// then the value being submitted for that field
post.addParameter(FIELD_USERNAME, "username");
post.addParameter(FIELD_PASSWORD, "password");

次に、HttpClient (org.apache.commons.httpclient.HttpClient) を使用して Post リクエストを実行しました。

注意すべきことの 1 つは、ログイン ページを手動で見てもわからない、渡された「隠し」パラメータがあったことです。これらは、JMeter を使用したときに明らかになりました。

ご不明な点がございましたら、喜んでご説明いたします。

于 2012-06-22T13:38:38.257 に答える