2013年5月29日水曜日

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

clj-webdriverを利用すると、Clojureでブラウザを制御できる。プログラムでWebアプリの自動テストや、ブラウザの自動制御が簡単にできるので、便利に使っている。
clj-webdriverでは任意のブラウザを制御できるので、ChromeのUser-Agentを変更してスマホ用のWebアプリを制御しようとしたが、clj-webdriver 0.6.0 では、Chrome Driver へ Capability を渡すコードがコメントアウトされており、User-Agentの変更ができないようだった。
そこで、該当箇所の関数を再定義して、ChromeでUser-Agentを変更できるようにした。

clj-webdriver-patch.clj

 

関数を再定義するプログラムは以下の通り。

(require 'clj-webdriver.core)

(ns clj-webdriver.core
  (:use [clj-webdriver driver])
  (:import org.openqa.selenium.remote.DesiredCapabilities))

(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 [cap (DesiredCapabilities/chrome)]
    ;; for Linux
    (.setCapability cap "chrome.binary" "/usr/lib/chromium-browser/chromium-browser")
    (if chrome-switches
      (.setCapability cap "chrome.switches" (into-array chrome-switches)))
    (init-driver (ChromeDriver. cap))))



サンプルコード


User-Agentを iPhone-3G にするコードを以下に示す。

http://code.google.com/p/chromedriver/downloads/list から Chrome Driver をダウンロードし、任意の場所に解凍しておく。
Chrome Driver実行ファイルのパスは以下のコードの (System/setProperty 〜) で設定する。

(ns webdriver-test.core
  (:require [clj-webdriver.taxi :as taxi]))

;; Driver path
(System/setProperty "webdriver.chrome.driver" "/home/hogehoge/opt/chromedriver")
;; (System/setProperty "webdriver.ie.driver" "set ie driver path")

(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 open-browser
  "Open browser."
  [browser]
  (taxi/set-driver! {:browser browser}))

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

(defn open-chrome [url]
  (taxi/set-driver! {:browser :chrome
                     :chrome-switches [(user-agent-switch *ua-iPhone-3G*)]}
                    url))



(open-chrome "https://www.google.com/") を実行すると スマホ用のGoogleトップを表示できる。