2013年10月6日日曜日

[Clojure] clj-webdriverでChromeのUser-Agentを変更する方法(その2)

[Clojure] clj-webdriverでChromeのUser-Agentを変更する方法 でUser-Agentを変更する方法を書いたが、先日、最新のChromeとchromedriverを使ってみると、User-Agentが変更できなくなっていた。
原因を調べてみると、DesiredCapabilitiesオブジェクトにchrome.switchesを追加しても、Chromeの起動オプションに追加されなくなっていた。
起動オプションの追加方法が変更されたようで、ChromeOptions#addArgumentsを使うと問題なく動作した。

実行環境

  • Windows 8
  • clj-webdriver 0.6.0
  • chromedriver 2.4
chromedriver 2.4 はこちらからダウンロードした。
従来のダウンロード先にあったドライバは全てdeprecatedになっており、http://code.google.com/p/chromedriver/wiki/WheredAllTheDownloadsGo?tm=2 では、以下の説明があった。
Downloads have been moved to http://chromedriver.storage.googleapis.com/index.html, because Google Code downloads are being deprecated!

project.clj

次のライブラリをdependenciesに追加した。

[clj-webdriver "0.6.0"]
[org.seleniumhq.selenium/selenium-java "2.35.0"]

src/cli_webdriver_patch.clj

前回と同様に、clj-webdriver.coreの関数を再定義して対応する。

(ns clj-webdriver-patch)

(in-ns 'clj-webdriver.core)
(import 'org.openqa.selenium.chrome.ChromeOptions)
(declare new-chrome-driver)

(defn new-driver
  "Start a new Driver instance. The `browser-spec` can include `:browser`, `:profile`, and `:cache-spec` keys.
The `:browser` can be one of `:firefox`, `:ie`, `:chrome` or `:htmlunit`.
The `:profile` should be an instance of FirefoxProfile you wish to use.
The `:cache-spec` can contain `:strategy`, `:args`, `:include` and/or `:exclude keys. See documentation on caching for more details."
  ([browser-spec]
     (let [{:keys [browser profile chrome-switches cache-spec]
            :or {browser :firefox
                 profile nil
                 chrome-switches nil
                 cache-spec {}}} browser-spec]
       (if (= browser :chrome)
         (new-chrome-driver chrome-switches)
         (init-driver {:webdriver (new-webdriver* {:browser browser
                                                   :profile profile})
                       :cache-spec cache-spec})))))
(defn new-chrome-driver
  [chrome-switches]
  (let [option (ChromeOptions.)]
    ;; for Linux
    ;; (.setBinary option "chrome.binary" "/usr/bin/google-chrome")
    (if chrome-switches
      (.addArguments option (into-array chrome-switches)))
    (init-driver (ChromeDriver. option))))


src/chrometest/core.clj

サンプルコード。
User-AgentにiPhoneを設定し、googleで「hogehoge」を検索する。

(ns chrometest.core
  (:require [clj-webdriver.core])
  (:use clj-webdriver-patch)
  (:require [clj-webdriver.taxi :as taxi]))

(System/setProperty "webdriver.chrome.driver" "c:/Application/chromedriver/chromedriver-2.4.exe")

(def ^:dynamic *ua-iPhone-3G* "Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5B108 Safari/525.20")

(defn user-agent-switch [user-agent]
 (str "--user-agent=\"" user-agent "\""))

(defn test1 []
  (taxi/set-driver! {:browser :chrome
                     :chrome-switches [(user-agent-switch *ua-iPhone-3G*)]})
  (taxi/to "https://www.google.com/")
  (taxi/input-text "input[name='q']" "hogehoge")
  (taxi/click "button[name='btnG']"))


Debian Wheezyでの実行

chromedriverの最新版はglibc2.1.15に依存しており、glibcのバージョンを上げなければならない。
How to upgrade glibc from version 2.13 to 2.15 on Debian? にglibcのバージョンを上げる方法が書かれていたが、試していない。