LoginSignup
5
8

More than 5 years have passed since last update.

Rubyのselenium-webdriverを使ってUAを偽装しつつWebテストをしてみる

Last updated at Posted at 2016-04-13

やりたかったこと

スマートホン最適化サイトでABテストを導入し、実装が完了しました。
しかしテストしているタイミングでABの割合が指定した割合になっているかが疑問をいだきました。
「少なく設定しているはずのBがずいぶんと多く出ていないか…?」
試行回数が少なくたまたま偏っただけの可能性もあります。
これの試行回数を増やし、設定した割合に落ち着くかを確認したかったのです。

なので今回、
UAを偽装してサイトにアクセス→ABのcookieの値を確認→cookieを削除→サイトにアクセス...以下繰り返し
を自動テストでやってみよう、となったのです。

やり方はいろいろあるかと思いますが、Rubyのselenium-webdriverを使ってやってみた次第です。
※最初FirefoxのSeleniumIDEでやろうとしましたが、セキュリティの観点からか使えなくなってました :disappointed_relieved:
スクリーンショット 2016-04-13 15.53.57.png

前準備

bundlerを使ってGemのインストールをします。
bundlerは使わなくてもいいですが、使った場合の手順で進めます。

Gemfile
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プログラムを書きます。
今回のは使い捨てのプログラムなので作りがアレだと思いますが大目に見てください。

test.rb
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の操作とかそういうのもできます。
繰り返しサイトにアクセスするとか機械的にできるところは有効活用していきましょう。

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8