SeleniumテストでのReCaptchaバイパス

ReCaptcha (一般的に愛されている「CAPTCHA」 )は、テストオートマトンが途中で遭遇する可能性のある最も痛みを伴うものの1つです。 日当たりの良いインドからの移民によって記録された何千ものさまざまなビデオが、この獣をだますことができるタンバリンとのダンスについてウェブ上を歩いています。 実際、「あなたはロボットではない」ことを確認することが主な目的であるプログラムスクリプトと対話することは非常に困難です。



非常に重要な免責事項: キャプチャを欺くことは不可能です。



すでにこの問題に遭遇しており、万能薬のレシピをグーグルで検索しようとしているこの記事を読んでいる場合は、それが存在しないことがわかります。 さらに、要素のランダムなマウスオーバー、入力のクリック、および慎重に配置されたThread.sleep()により、WebDriverを使用して現実的なユーザーの動作を模倣するという革新的な考えが頭に浮かびます。 このアプローチが機能しないことは絶対に知られています。無駄に時間を無駄にしないでください。



画像



出口はありませんか?



すべてが悲観的というわけではありません。 「自分より前の課題は何ですか?」という質問に対する最も正確な答えを自分で与えようとするだけで十分な場合があります。 ほとんどの場合、目標はキャプチャを欺くことではなく、その背後にある機能をテストするためにキャプチャをバイパスすることであることを理解します。 私のケースの例では、タスクを解決するために見つけたオプションを共有します。



コンテキスト:製品の一部をサードパーティのサービスに統合し、すべてが問題ないかどうかを監視したかったのは、 プラットフォームのサードパーティの部分は対象外です。 機能にアクセスするには、最初にログインする必要がありました。 その時、私はキャプチャーと顔を合わせて会いました。 次に、この問題を回避しようとしたすべてのオプションを示します。




非稼働



GoogleまたはFacebook経由でログイン



従来の認証に加えて、Google / Facebookによる正規のログインがありました。 もちろん、彼らの「キャプチャ」もそこにあったので、このオプションは問題を解決するのに役立ちませんでした。



ユーザーの行動をシミュレートする



はい、私も試してみました。 それは面白かったが、あまりにも素朴でした。






労働者



Chrome / Firefoxのプロファイル



最初の「ライブ」オプションについて話しましょう。 これらのブラウザーのドライバー(chromedriver / geckodriver)には、事前定義されたユーザープロファイルで起動する機能があります。 保存されているすべてのパスワード、Cookie、セッション、さらにはブラウザの履歴とブックマークも保存します。 つまり したがって、タスクにとって絶対に重要ではないログイン手順を単に見逃したため、テストオブジェクトのあるページに直接到達しました。 次のように実装されます。



  1. 「クリーンな」ブラウザプロファイルを作成する
  2. 手動でキャプチャを入力し、目的のリソースにログインします
  3. 必要なプロファイルをプロジェクトにコピーします( FirefoxおよびChromeの HOWTO)


その後、指定されたプロファイルからロードする必要があることをドライバーに伝える必要があります。



Firefox:



//   FirefoxProfile profile = new FirefoxProfile(new File("////")); //      FirefoxOptions options = new FirefoxOptions(); options.setProfile(profile); //   WebDriver driver = new FirefoxDriver(options);
      
      





Chrome:



 //      ChromeOptions options = new ChromeOptions(); options.addArgument("--user-data-dir=/////"); options.addArgument("--profile-directory=____"); //   WebDriver driver = new ChromeDriver(options);
      
      





ブラウザと通常のgecko / cromedriversがインストールされたローカルマシンでテストする場合、このアプローチは適切であることが証明されましたが、Jenkinsで実行する場合は問題がありました。 SeleniumハブとKubernetesクラスター内のノードを上げるため、コンテナー内にディレクトリをマウントするには長すぎるディレクトリという形で問題が発生しました(クリーンなプロファイルは平均で約25 MBで、これはかなり多いです)、ブラウザのCRUDアクセス許可に関する問題実行時にプロファイルに変更を加えることができず、「不明なエラー:prefsファイルの書き込みに失敗しました」の実行で失敗しました。 さらに、Cookieとセッションが有効期限に達した後にプロファイルを更新するのはかなり不便であり、プロジェクト内にプロファイルのある巨大なフォルダーを保持したくなかったため、最終的に次のオプションが選択されました。



クッキー



「そして、ボックスがちょうど開きました」-これは、手動で受け取ったCookieをドライバーに追加した直後に、状況を説明する方法でした。 アクションのアルゴリズムは可能な限り単純で、選択したブラウザーに依存しません。



  1. 手動でログインする
  2. ネットワークを介して、リクエストヘッダー->ブラウザが送信するCookieを確認します


次のようにテストに追加します。



 //  cookie private static final Cookie COOKIE = new Cookie("", "", "", "", new Date("")); //   WebDriver driver = new ChromeDriver(options); //  cookie   driver.manage().addCookie(COOKIE);
      
      





このアプローチの明らかな欠点は、有効期限が切れた後にクッキーを手動で変更する必要があることです。 ただし、この期間はテスト対象プラットフォームで3か月であるため、このソリューションを選択しました。






そして、ログインする必要がない場合はどうなりますか?





しかし、承認やセッションではなく、1回限りのアクション(バスケットからの注文、新しいユーザーの登録など)の委託についてはどうでしょうか? ここで状況はさらに悪化しています。 私が見つけることができる2つのオプションは次のとおりです。



  1. 開発者に同意して、何らかの回避策を提供してください。 Googleはこのような機会を提供しますが、セキュリティに意識的に小さな穴を開けることを忘れないでください。
  2. サードパーティの有料サービスを利用して、キャプチャのスクリーンショットを撮り、デコードを試みて、復号化された値を送信します。 私自身はこの方法を試していないので、完全に推奨することはできません。





まとめると



ご覧のとおり、絶望的な状況はありません。 ただし、上記のオプションのすべてに独自の非常に重要な欠点があることを否定するのは愚かなことなので、選択はあなた次第です。



ご清聴ありがとうございました。



PS実生活で機能する他のソリューションを知っている場合は、コメントでそれらを説明してください。読むのは非常に興味深いでしょう。



All Articles