やりたかったこと
スマートホン最適化サイトでABテストを導入し、実装が完了しました。
しかしテストしているタイミングでABの割合が指定した割合になっているかが疑問をいだきました。
「少なく設定しているはずのBがずいぶんと多く出ていないか…?」
試行回数が少なくたまたま偏っただけの可能性もあります。
これの試行回数を増やし、設定した割合に落ち着くかを確認したかったのです。
なので今回、
UAを偽装してサイトにアクセス→ABのcookieの値を確認→cookieを削除→サイトにアクセス...以下繰り返し
を自動テストでやってみよう、となったのです。
やり方はいろいろあるかと思いますが、Rubyのselenium-webdriverを使ってやってみた次第です。
※最初FirefoxのSeleniumIDEでやろうとしましたが、セキュリティの観点からか使えなくなってました
前準備
bundlerを使ってGemのインストールをします。
bundlerは使わなくてもいいですが、使った場合の手順で進めます。
source 'https://rubygems.org/'
gem 'selenium-webdriver'
gem 'webdriver-user-agent'
webdriber-user-agentは、selenium-webdriverを利用するときに簡単にUAを偽装するためのgemです。
vendor/bundle以下にインストールするようにします。
$ bundler install --path=vendor/bundle
以上で準備は完了です。
動かす
テストを動かすRubyプログラムを書きます。
今回のは使い捨てのプログラムなので作りがアレだと思いますが大目に見てください。
require 'selenium-webdriver'
require 'webdriver-user-agent'
require 'pp'
class Get
attr_reader :data
COOKIE_NAME = 'cookiename' # 取りたいクッキーの名前を指定します
def initialize
#@driver = Selenium::WebDriver.for :firefox # UAの偽装がいらない場合はSeleniumモジュールの方を使います
# 引数でブラウザやUA、画面の向きを指定できます。
# 指定しない場合、ブラウザはfirefox, UAはiPhone, 画面は縦向きという設定になります。
# see also: http://www.rubydoc.info/gems/webdriver-user-agent/7.4
@driver = Webdriver::UserAgent.driver
@data = []
end
def open
@driver.navigate.to 'http://hogehoge.com/example' # テスト対象のURLを指定します
cookies = @driver.manage.all_cookies # 現在表示してるページで使えるcookieを全部取得します。配列です。
cookie_index = cookies.find_index do |cookie|
cookie[:name] == COOKIE_NAME
end # ほしいcookieの順番を特定します
return unless cookie_index # indexが取れなかったらcookieがセットされてないものと見なしてnilを返します
@data << cookies[cookie_index][:value] # とれたらそのcookieの値を結果の配列に突っ込みます
@driver.manage.delete_cookie(COOKIE_NAME) # 該当のcookieを消すことで新しいABユーザとします
end
def destruct
@driver.quit # 終了処理です。やっておくとブラウザを閉じてくれます。
end
end
get = Get.new
begin
1.upto(500) do # 試行回数500回で試してみます
get.open
sleep 0.2 # 誰かがクローリングしてる!って怒られるのを恐れてsleepさせてます。(自社サイトかつ開発環境なので不要ですが念のため)
end
ensure
get.destruct
end
a_array = get.data.select {|v| v == 'a'}
b_array = get.data.select {|v| v == 'b'}
pp "aの数:#{a_array.size}"
pp "bの数:#{b_array.size}"
# なんかもっと簡単にカウントできる気がするけど、面倒なのでこれで。
コード内に解説というか補足を埋め込みまくっちゃいましたが、だいたいこんな感じです。
これを走らせると
$ bundler exec ruby test.rb
"aの数:372"
"bの数:128"
こんな出力になって、だいたい75:25という設定した通りの割合になってるね、と確認が済んだ次第です。
まとめ
selenium-webdriverはブラウザを操作する機能が用意されていて、例えばformの操作とかそういうのもできます。
繰り返しサイトにアクセスするとか機械的にできるところは有効活用していきましょう。