29 May 2014, 12:36

Seleniumをブラウザなしで起動するための方法を調べた

やりたいこと

Seleniumでテストを実行するとき、いちいちブラウザを立ち上げると重くて遅い。

そこで、ブラウザを立ち上げずに、 ヘッドレス(headless)にSeleniumを実行する方法を調べてみた。

Seleniumは実行するブラウザを自由にいれかえることができる。 そこで、特殊なブラウザを指定することによって実現できそうだ。

Environment

<div class="outline-text-3" id="text-1-1">
  <ul class="org-ul">
    <li>
      windows 7 64bit
    </li>
    <li>
      ruby 2.0
    </li>
  </ul>

  <p>
    環境はRuby & Windowsです。
  </p>

  <p>
    [toc]
  </p></p>
</div></p>

Base

このコードを改造する。ベースのドライバは firefox

require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://google.com"
element = driver.find_element(:name, 'q')
element.send_keys "PhantomJS"
element.submit
puts driver.title

driver.quit

HtmlUnit Driver

HtmlUnit Driverの特徴は、

  • HtmlUnit は GUI を持たない WebBrowser の Java ベースの実装
  • ava 以外の言語でこのドライバーを使用するには Selenium サーバーが必要

ということで、以下からSelenium Serverを取ってくる。 検索窓から selenium-serverと検索して、最新版のjarファイルを落とす。

コマンドラインから起動。

> java -jar selenium-server-standalone-2.39.0.jar

<p>
  <a href="http://www.storklab.com/seleniumhq.org/docs/03_webdriver.html#htmlunit-driver">この</a> ページに従って、以下のように書く。
</p>

<div class="org-src-container">
  <pre class="src src-language">driver = Selenium::WebDriver.for :remote, :url =&gt; "http://localhost:4444/wd/hub", :desired_capabilities =&gt; :htmlunit

<p>
  ページの取得は成功したけれども、検索窓を探すことができなかった。別の手段をば。
</p></p>

PhantomJS Driver

PhantomJS Driverは、No Browserなブラウザ。(意味不明)

PhantomJSの内部でGhostDriverというものを利用して、 これでNo GUIなブラウザを実現しているらしい。

以下のサイトからwindows用のバイナリをダウンロードして、 phantomjs.exeするだけ。

phantomjs.exe --webdriver=9134

<div class="org-src-container">
  <pre class="src src-language">require "selenium-webdriver"

driver = Selenium::WebDriver.for(:remote, :url => “http://localhost:9134")

driver.navigate.to “http://google.com" element = driver.find_element(:name, ‘q’) element.send_keys “PhantomJS” element.submit puts driver.title driver.quit

<p>
  また、phantom.exeに環境変数PATHを通すことで、 以下のように書くことができる。
</p>

<p>
  こうすると、 rubyスクリプト起動の延長でphantomjsを起動してportに接続してくれる。
</p>

<div class="org-src-container">
  <pre class="src src-language"># driver = Selenium::WebDriver.for(:remote, :url =&gt; "http://localhost:9134")

driver = Selenium::WebDriver.for :phantomjs

gem headless

linuxだとこういう方法もある。

Xvfbという仮想ブラウザウ利用するのでwindowsではできない。