はじめに
こんにちは、白川です。
Webアプリケーションは概ね、複数のブラウザに対応する必要があります。
Internet Explorer、Firefox、ChromeなどのPCブラウザだけでなく、
iPhoneやAndroidなどのモバイル/タブレットのブラウザにも対応しないといけなかったり、
同じブラウザでも複数のバージョンに対応する必要があったり、
OSのバージョンの違いにも対応する必要があったりします。
そうなってくると、テストが大変です。
検証が必要なOSとブラウザとバージョンの組合せが増えれば増えるほど、手動でテストを行なうことが大変になっていきます。
しかし、Selenium Gridを使えば、
一つのテストスクリプトで複数の実機のブラウザで自動にテストを実施することが可能となります。
Selenium Gridについて
テストスクリプトを実行するサーバからSelenium Grid Server(Hub)に対して、
このOSのこのバージョンのブラウザでテスト実施したい、という依頼を投げると、
Selenium Grid Server(Hub)が登録されているNodeの中から適切なNodeに対して処理を振り分けする、という流れになります。
今回は、Selenium Grid Server(Hub)とNodeを立てて、
ブラウザを起動させてスクリーンショットを保存するところまで試してみました。
環境
以下、実際に試してみた環境です。
■ Selenium Grid Server(Hub)
・OS:CentOS6.6 64bit
・Java:1.7.0_71
■ Node
・OS:Windows8.1 64bit
・java:1.8_40
・Internet Explorer:11.0
・Firefox:36.0
・Chrome:42.0
■ テストスクリプト実行サーバ
・OS:CentOS6.6 64bit
・ruby:2.1.1
・Rails:4.1.1
・Bundler:1.7.12
・selenium-webdriver:2.43.0
Selenium Grid Server(Hub)の立て方
まず、Hubにしたいサーバに以下のURLからselenium-server-standalone-2.45.0.jarをダウンロードします。
http://docs.seleniumhq.org/download/
ダウンロード後、下記コマンドでSelenium ServerをHubとして起動します。
1 2 |
cd [jarをダウンロードしたディレクトリ] java -jar selenium-server-standalone-2.45.0.jar -role hub |
下記URLにアクセスすると、Gridコンソールというものが表示されます。
http://[Selenium Grid ServerのIPアドレス]:4444/grid/console
本来であればGridに登録されたNodeが一覧表示されるはずですが、
この時点ではNodeは1台も存在していないので、何も表示されません。
Nodeの立て方
Selenium Grid Server(Hub)と同様にNodeとなる端末に
selenium-server-standalone-2.45.0.jarをダウンロードします。
jsonでNodeの設定ファイルを作成します。
設定ファイルにはブラウザの種類とGridのURLを記載して、ファイル名をnode.jsonとして上記jarと同じディレクトリに保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
{ "capabilities": [ { "browserName": "firefox", "maxInstances": 1, "version": "36.0", "seleniumProtocol": "WebDriver" }, { "browserName": "chrome", "maxInstances": 1, "version": "42.0", "seleniumProtocol": "WebDriver" }, { "platform": "WINDOWS", "browserName": "internet explorer", "maxInstances": 1, "version": "11", "seleniumProtocol": "WebDriver" } ], "configuration": { "hub": "http://[Selenium Grid ServerのIPアドレス]:4444/grid/register" } } |
Firefoxは別途ドライバ無しでもテスト実行できるのですが、
Chrome、Internet Explorerでテストをしたい場合は、それぞれドライバをselenium-server-standalone-2.45.0.jarと同じディレクトリにダウンロードします。
■ Chrome
http://chromedriver.storage.googleapis.com/index.html?path=2.15/
■ Internet Explorer
http://selenium-release.storage.googleapis.com/index.html?path=2.45/
私の環境は64bitなので、64bitバージョンのドライバをダウンロードします。
あと、Internet Explorerでテストする場合、
ツール>インターネットオプションの中のセキュリティタブで、
すべてのゾーンの「保護モードを有効にする」を統一する必要があります。
また、Internet Explorer11の場合のみですが、
Selenium WebDriverを動かそうとすると、「Unable to get browser」というエラーが発生します。
Issue 6511: IE11 exceptions with IEDriverServer: Unable to get browser
上記のエラーはレジストリをいじることで回避できます。
64bitのWindowsの場合、"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE"というキーで"iexplore.exe"という名前にDWORDで0の値を設定することで、動作するようになりました。
32bitの場合は、"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE"というキーでレジストリを登録すれば動くようです。
準備ができたので、下記コマンドでSelenium ServerをNodeとして起動します。
1 2 |
cd [jarをダウンロードしたディレクトリ] java -jar selenium-server-standalone-2.45.0.jar -role node -nodeConfig node.json -Dwebdriver.ie.driver=IEDriverServer.exe -Dwebdriver.chrome.driver=chromedriver.exe |
この時点で、Selenium Grid ServerにNodeが登録されました。
下記にアクセスすると、1台のNodeが登録されていて、
Internet Explorer、Firefox、Chromeの3つのDriverが使用できることが分かります。
http://[Selenium Grid ServerのIPアドレス]:4444/grid/console
Nodeを追加する場合は、
別のNodeにしたい端末で同じようなことをしてあげればOKです。
テストスクリプトの作成
テストスクリプトはJavaやJavaScript、Pythonなどでも記述することが可能ですが、
今回はRubyで作成します。
まず、railsのルートディレクトリに移動して、Gemfileに下記を追加します。
1 2 3 4 |
group :test do gem "rspec-rails", "~> 3.1.0" gem "selenium-webdriver", "~> 2.43.0" end |
追加後、下記コマンドを実行します。
1 2 3 |
bundle exec rails g rspec:install mkdir -p spec/features # テストスクリプトを保存するディレクトリ作成 mkdir -p screenshot/{chrome,firefox,internet_explorer} # スクリーンショット保存用のディレクトリ作成 |
テストスクリプトを作成して、spec/features/selenium_spec.rbとして保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# coding: utf-8 require "selenium-webdriver" describe "Seleniumのテスト" do attr_reader :selenium_driver alias :page :selenium_driver before(:all) do @verification_errors = [] # テスト全体のタイムアウト設定(秒) @client = Selenium::WebDriver::Remote::Http::Default.new @client.timeout = 120 # テスト対象のブラウザ、バージョン、OS指定 # IEは"internet explorer"で渡してあげないと、 # Error forwarding the new session cannot find : Capabilities というエラーで怒られる @browser_name = (ENV["TARGET_BROWSER"] == "internet_explorer" ? "internet explorer" : ENV["TARGET_BROWSER"]) || "" @version = ENV["VERSION"] || "" @platform = ENV["PLATFORM"] || "any" @capabilities = Selenium::WebDriver::Remote::Capabilities.new(:browser_name=>@browser_name, :version=>@version, :platform=>@platform) # WebDriver初期化 @driver = Selenium::WebDriver.for :remote, :url => "http://[Selenium Grid Server(Hub)のIPアドレス]:4444/wd/hub", :desired_capabilities => @capabilities, :http_client => @client @base_url = "https://www.google.co.jp" @accept_next_alert = true # find_elementでWebDriver は要素がすぐに見つからない場合、指定時間待つ @driver.manage.timeouts.implicit_wait = 30 end before(:each) do end after(:each) do @driver.quit end it "Googleで検索" do # 検索ページ表示 @driver.get(@base_url + "/") expect(@driver.title).to eq("Google") @driver.find_element(:id, "lst-ib").click # 検索キーワード入力⇒検索 @driver.find_element(:id, "lst-ib").send_keys "SynergyMarketing" @driver.action.send_keys(:return).perform # 検索結果のリンクをクリック @driver.find_element(:partial_link_text, "お客様のマーケティングのすべてを支援").click @driver.find_element(:id, "sb-site") expect(@driver.title).to eq("お客様のマーケティングのすべてを支援 シナジーマーケティング株式会社 SynergyMarketing") # スクリーンショット取得 @driver.save_screenshot "screenshot/" + ENV["TARGET_BROWSER"] + "/screenshot.png" end end |
テストスクリプトが作成できたので、テストを実行します。
下記コマンドを実行すると、Nodeのブラウザが自動で起動して操作が始まります。
1 2 3 |
TARGET_BROWSER=internet_explorer bundle exec rspec spec/features/selenium_spec.rb TARGET_BROWSER=firefox bundle exec rspec spec/features/selenium_spec.rb TARGET_BROWSER=chrome bundle exec rspec spec/features/selenium_spec.rb |
ブラウザ指定のみ行っていますが、
以下のようにOSやブラウザのバージョン指定することも可能です。
1 2 |
TARGET_BROWSER=internet_explorer VERSION=11 PLATFORM=Windows \ bundle exec rspec spec/features/selenium_spec.rb |
下図は、テストスクリプトを実行して取得したスクリーンショットです。
残念なことにChromeだけ途中で切れてしまっています・・・
以下を見ると、ChromeDriverの不具合のようですが、現時点では修正されていないようです。
このあたりどうするかは課題だと思います。
https://code.google.com/p/chromedriver/issues/detail?id=294
終わりに
一つのテストスクリプトで複数の実機ブラウザの自動テストが繰り返し出来るので、
上手く使いこなせることができれば、実機テストが非常に楽になるのでは、という印象です。
あと、iPhoneやAndroidなどのモバイルやタブレットなどの実機もNodeとして扱えるはずなのですが、
現時点では試せていないので、またの機会にご紹介できればと思います。