Selenium(Torを使う為のFireFoxDriver)をjavaで利用する(その3)
今回はSeleniumについて、JAVAで利用する際のテクニックをご紹介したいと思います。前回はChromeDriverを使った例でしたので、今回はFireFoxDriver(と言ってもTorを利用、理由は後ほど)を用いたいと思います。まずは「Selenium」のFireFox用のWebDriverをここからダウンロードします。上記サイトからFireFoxを稼働しているOS環境に併せた最新の「geckodriver」という名前のドライバをダウンロードします。※私はWindows10 の64Bitですので、「geckodriver-v0.26.0-win64.zip」をダウンロードしました。ダウンロードしたファイルを解凍し、配置する場所を決めて格納します。その後JAVA上でSystem.setProperty("webdriver.gecko.driver", "X:\\exe\\geckodriver.exe");と言った感じで、システムプロパティにドライバの格納場所を記述します。⇒日本語Windowsなので、「/」は「\\」として記載して下さい。依存ライブラリにつきましては前回説明しましたので、設定方法は割愛します。ここから本題の「Tor」を利用する設定に移りたいと思います。そもそも何故今回「Tor」を利用するかと言いますと、WEBシステム上ではDoS攻撃などを防ぐ為に、同じIPアドレスから連続して同じ操作が出来ないような仕組みが多く行われています。今回のようにSeleniumを使ってブラウザアプリのテスト自動化をした際、同じ端末からロボットのようにブラウザ操作を繰り返すのと同様となりますので、実はこのDoS攻撃用の制御がテストの邪魔になる事があります。かと言って、テスト中はサーバ側の上記不正検知制御を外しておくという手立てもありますが、この一時しのぎの対応をリリース前に再度修正する事を忘れると、セキュリティホールとして不正利用の温床になる事が多くあります。(そりゃ人間が作るものですからね、テスト完璧と思っていても、ど忘れのバグなんて多くある話です。。。)このようなIPアドレスによる連続操作不正検知をかいくぐる為に、「Tor」というツール(この記事を書いている時点ではFireFoxベースのブラウザのようなものです)があります。※ですので不正行為の為の利用は犯罪になりますので、決して目的外用途で利用しないでくださいね。この「Tor Browser」という名前のFireFoxブラウザを今回利用する事で、匿名性を活用してサイクルテストが行えるようにしたいと思います。実装方法は色々ありそうなのですが、実際に私が動作できた例を元に説明します。※実はFireFoxProfileクラスの設定で結構躓いたのと、従来より読み込み速度が落ちますので最初の描画完了後の待機時間(Sleep時間)の調整に手間取りました。。。実装例は以下の通りです。(いや~、我ながらダサいソースです…。)⇒下線部は実際にTor Browserをこちらからダウンロード・インストールして、そのインストール先に併せて書き換えて下さい。String torPath = "X:\\Tor Browser\\Browser\\firefox.exe";String profilePath = "X:\\Tor Browser\\Browser\\TorBrowser\\Data\\Browser\\profile.default";File torProfileDir = new File(profilePath);FirefoxBinary binary = new FirefoxBinary(new File(torPath));FirefoxProfile profile = new FirefoxProfile();profile.setPreference("network.proxy.type", 1);profile.setPreference("network.proxy.socks", "127.0.0.1");profile.setPreference("extensions.torlauncher.start_tor", false);profile.setPreference("extensions.torbutton.block_disk", false);profile.setPreference("extensions.torbutton.custom.socks_host", "127.0.0.1");profile.setPreference("extensions.torbutton.custom.socks_port", 9150);profile.setPreference("extensions.torbutton.inserted_button", true);profile.setPreference("extensions.torbutton.launch_warning", false);profile.setPreference("privacy.spoof_english", 2);profile.setPreference("extensions.torbutton.loglevel", 2);profile.setPreference("extensions.torbutton.logmethod", 0);profile.setPreference("extensions.torbutton.settings_method", "custom");profile.setPreference("extensions.torbutton.use_privoxy", false);profile.setPreference("extensions.torlauncher.control_port", 9251); // 9251profile.setPreference("extensions.torlauncher.loglevel", 2);profile.setPreference("extensions.torlauncher.logmethod", 0);profile.setPreference("extensions.torlauncher.prompt_at_startup", false);profile.setPreference("browser.startup.page", "0");profile.setPreference("browser.startup.homepage", "about:newtab");profile.setPreference("extensions.torlauncher.prompt_at_startup", 0);profile.setPreference("webdriver.load.strategy", "normal");profile.setPreference("app.update.enabled", false);profile.setPreference("extensions.torbutton.versioncheck_enabled", false);profile.setPreference("extensions.torbutton.prompted_language", true);profile.setPreference("network.proxy.socks_port", 9150);profile.setPreference("extensions.torbutton.socks_port", 9150);FirefoxOptions options = new FirefoxOptions();options.setBinary(binary);options.setProfile(profile);options.setCapability(FirefoxOptions.FIREFOX_OPTIONS, options);WebDriver driver = new FirefoxDriver(options);あとは前回のChromeDriverの説明同様、Seleniumのクラスを用いて色々試すのみとなります。一点注意事項としましては、Torを用いたアクセスなのでコンテンツのロードに少し時間を要しますので、特に初回アクセス時はブラウザが描画し終わるまで少し長めのSleep設定が必要という事だけご理解下さい。ひょっとしたらWindowsファイヤーウオールなどでブロックが起るかもしれませんので、それぞれの環境に併せてポートを解放してあげてください。(今回の例でいくと「9150」ポートが対象になります。)あとは色々とネット検索しながら、Seleniumをお試し下さい!エキスパートが教えるSelenium最前線(CodeZine Digital First)翔泳社三省堂書店オンデマンド価格:2200円(税別、送料別)(2020/2/18時点)楽天で購入