Ruby의 selenum-webdriver를 사용하여 UA를 위장하면서 웹 테스트를 시도합니다.

하고 싶었던 일



스마트폰 최적화 사이트에서 AB 테스트를 도입하여 구현이 완료되었습니다.
그러나 테스트하고 있는 타이밍에 AB의 비율이 지정한 비율이 되어 있는지가 의문을 받았습니다.
"적어도 설정하고 있어야 할 B가 많이 많이 나오지 않았나…?"
시도 횟수가 적고 우연히 치우칠 수 있습니다.
이 시도 횟수를 늘리고 설정한 비율에 진정하는지 확인하고 싶었습니다.

그래서 이번에는
UA를 가장하여 사이트에 액세스 → AB의 쿠키 값 확인 → 쿠키 삭제 → 사이트에 액세스 ... 아래 반복
를 자동 테스트로 해보자, 되었습니다.

하는 방법은 여러가지라고 생각합니다만, Ruby의 selenum-webdriver를 사용해 보았던 대로입니다.
※ 처음 Firefox의 SeleniumIDE에서 시도하려고했지만 보안 관점에서 사용할 수 없었습니다.


이전 준비



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의 조작이라든지 그러한 것도 할 수 있습니다.
반복 사이트에 액세스하거나 기계적으로 할 수 있는 곳은 유효 활용해 갑시다.

좋은 웹페이지 즐겨찾기