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ではできない。

24 May 2014, 06:18

Sikuli, Selenium, WSH, 3つの自動化ツールでGoogle検索自動化に挑め!

はじめに

前回、Sikuliの使い方を調べてみました。

今回は、Sikuliと別のツールを組み合わせてみます。前回記事の続編です。

やること

以下の手順を自動化します。

  1. firefoxを立ち上げる
  2. 検索窓にSikuliと入力する
  3. 検索ボタンをおす

以下のツールを利用します。

  • Sikuli … 画像認識による自動化ツール
  • Selenium … HTML解析による自動化ツール
  • WSH … キー操作の自動化ツール

なんだか、ヨットに対して戦車と軍艦と戦闘機で総攻撃をかけるような感じになってきた。

使う手段

JRubyです。以下を利用。

  • win32ole
  • sikulixapi
  • selenium-webdriver

win32oleはデフォルトで入っている。sikuliは前回記事を参照。

selenium-webdriverは、jgem install selenium-webdriverで問題なくインストール。

結果

自動化がキマるとけっこうきもちいい。

09 May 2014, 22:39

Selenium BuilderでRubyコードを自動生成して実行する

次世代Selenium IDEと唱われている、Selenium Builderを試したメモ。

次世代Selenium IDE

次世代という意味は、Selenium2 、 つまりWebdriverをサポートしているということ。

Selenium IDEは Selenium1(or RemoteConsole RC)をサポートしている。

Selenium Builderの準備

<div class="outline-text-3" id="text-1-1">
  <p>
    Selenium Builderは forefoxのブラグイン。 なので、まずはfirefoxをインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.mozilla.org/ja/firefox/new/">Firefox のダウンロード — 自由な Web ブラウザ — Mozilla</a>
    </li>
  </ul>

  <p>
    次に、以下からプラグインをインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sebuilder.github.io/se-builder/">Selenium Builder &#8211; The next evolution</a>
    </li>
  </ul>

  <p>
    firefoxを再起動後、Ctrl+Alt+B or メニュー -> 開発ツール -> Launch Senium Builder.
  </p>

  <p>
    Selenium Builderについては、以下の記事がとても詳しい。Special Thanks!!
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://blog.trident-qa.com/2013/12/selenium-builder-vs-ide-recap/">次世代のIDE、Selenium Builderまとめ | 品質向上ブログ</a>
    </li>
  </ul>

  <p>
    まとまったドキュメントはここ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/sebuilder/se-builder/wiki">Pages · sebuilder/se-builder Wiki</a>
    </li>
  </ul>
</div></p>

ruby selenium webdriverの準備

<div class="outline-text-3" id="text-1-2">
  <p>
    rubyから seleniumを利用するために、selenium-webdriverを利用する。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">gem install selenium-webdriver

  <p>
    プロキシ配下では以下。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">gem install selenium-webdriver -r -p http://username:password@proxy.hostname:port

<div id="outline-container-sec-1-2-1" class="outline-4">
  <h4 id="sec-1-2-1">
    Windows環境のワナ
  </h4>

  <div class="outline-text-4" id="text-1-2-1">
    <p>
      Windows環境でgem installを動かすためには、devkitのインストールが必要。 RubyInstallerと Devkitをセットでインストールする必要がある。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://rubyinstaller.org/">RubyInstaller for Windows</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-1-2-2" class="outline-4">
  <h4 id="sec-1-2-2">
    Cygwin環境のワナ
  </h4>

  <div class="outline-text-4" id="text-1-2-2">
    <p>
      そもそも、Cygwin環境では 依存パッケージのffiがバグっててインストールできない。
    </p>

    <p>
      Cygwin64bit版は依存しているffiライブラリがバグってる! パッチを当てる必要があるという茨の道。
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://github.com/ffi/ffi/issues/284">https://github.com/ffi/ffi/issues/284</a>
      </li>
    </ul>

    <div class="org-src-container">
      <pre class="src src-sh">$ gem install selenium-webdriver

Building native extensions. This could take a while… ERROR: Error installing selenium-webdriver: ERROR: Failed to build gem native extension.

    /usr/bin/ruby.exe extconf.rb

checking for ffi.h… *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more

    <p>
      回避方法をためしてみても、自分の環境ではうまくいかなかったので諦め。
    </p></p>
  </div></p>
</div></p>

Rubyコードを生成

自動化したいページで右クリックする。

SeleniumBuilderが立ち上がる。記録の開始を選択して、作業を記録。

記録が終わったら、ツールバー -> ファイル -> エクスポートを選択。

Selenium2としては以下の形式へExportできる(2014/5現在)

Selenium1としてExportするとさらに対応言語が多くなる。

Selenium1だと、RubyのRSpecやtextunitにも対応しているようだ。 もっともっと多くなるのは時間の問題だろう。スゴい!

Rubyを選択して、Rubyのコードを生成。

require 'rubygems'
require 'selenium-webdriver'
wd = Selenium::WebDriver.for :firefox

wd.get "https://www.google.co.jp/"
wd.find_element(:id, "lst-ib").click
wd.find_element(:id, "lst-ib").clear
wd.find_element(:id, "lst-ib").send_keys "Selenium Builder"
wd.find_element(:css, "div.tsf-p").click
wd.find_element(:name, "btnK").click
wd.quit

<p>
  selenium-webdriverがrequireされいてるところに注目されたし。
</p></p>

Rubyコードを実行

生成したコードをコマンドラインから実行するだけ!こんなに簡単だとは!

09 Sep 2012, 07:42

WindowsバッチファイルをJenkinsで起動したらネットにアクセスできない

Selenium RCの起動をWindowsのバッチファイルにして、Jenkinsから起動したら、

Firefoxを立ち上げたところで処理が止まってしまう。

05:55:02.690 INFO – Preparing Firefox profile…

05:55:04.964 INFO – Launching Firefox…

05:55:06.985 INFO – Checking Resource aliases

Jenkinsを介さずに、Windowsのコマンドプロンプトからならば、

処理が停滞しないので、さらにわけが分からない。

どうやら、Jenkinsからではインターネットにアクセスできないようだ。

処理が停滞するのは、URLのopenがタイムアイトしているから。

JenkinsはWindowsのサービスとして起動している。

そして、Windowsのサービスからインターネットにアクセスしようとして、

ファイアウォールに引っかかっているようだ(という推測)。

[コントロールパネル]>[管理ツール]>[サービス]

からJenkinsのプロパティを開いて、

[ログオン]タブの『デスクトップとの対話をサービスに許可』

を選択すると、サービスが起動している画面に移動でき、

停滞している画面を見ることができる。

image

image

メッセージの表示を選択すれば、Firefoxが停滞している様子が見える。

この課題を解決するには、ネットワーク設定をいじる必要がありそうだけれど、

よくわからなかった。

Slaveノードを作成して、Windowsサービスとして登録せずに起動する

自分がたどりついた方法は、Slaveノードを作成して、

そいつはWindowsサービスとしては登録しないまま、ネットにアクセスさせる方法。

まずは、

[Jenkinsの管理] > [ノードの管理]> [新規ノードの作成]からノード作成。

このとき、

詳しくは参考ページを参照。

Jenkinsスレーブの作成と設定 -ムーチョのメモ帳
https://wiki.jenkins-ci.org/display/JA/Step+by+step+guide+to+set+up+master+and+slave+machines

作成したノードをブラウザ上から立ちあげると、こんな窓が出てくる。

image

この状態で、Seleniumパッチを実行すると、問題なくネットへアクセスできた。

 

JenkinsをWindowsサービスとして立ちあげない

昨日のエントリの続き。

寝て起きたら、もっとカンタンな(当たり前な?)方法を思いついた。

JenkinsがWindowsのスタートアップでサービスとして起動することが問題なので、

サービスを無効にしてしまえばよい。

[コントロールパネル]>[管理ツール]>[サービス]

からJenkinsのプロパティを開いて、サービスを停止する。

停止したら、コマンドラインから、Jenkinsを手動で立ち上げなおす。

cd ”C:\xxxxxx\Jenkins”

java -jar jankins.war

すると、しばらくしてJenkinsがWindowsのサービスとしてではなく

立ちあがるので、この状態ならばネットにつなげた。

02 Sep 2012, 08:39

Selenium RCで自分のPCからテストケースを実行する

Selenium IDEでテストケースができたけれど、

これではいちいちブラウザから起動しないとテストを実行できない。

定期的に実行することを自動化するためには、Selenium RCを入れる。

Selenium RCでコマンドラインからテストを実行する

Selenium RCを使うことで、

Selenium IDEで作成したテストソースをコマンドラインから実行できる。

コマンドラインから実行できれば、あとはそれをJenkinsでスケジューリングすれば

よいというわけだ。というわけで、Selenium RCを導入する。

Selenium RCはServerとDriverの2つの部品からなる。

まずは、サイトからSelenium Serverをダウンロード。(日本語サイトは古い)

http://seleniumhq.org/download/

Selenium Serverは以下の形式で実行する

java -jar seleium-server.jar <テストスィートのURL> <テスト結果を出力するファイル>

前回作成した Selenium IDEのテストスイートを実行するには、

パラメータは以下をセット

*firefox
http://www.google.com
<テストスィートのURL> C:\Selenium\1day_post_pure.html
<テスト結果を出力するファイル> C:\Selenium\TestResult.html

コマンドプロンプトより、コマンド実行。

java -jar selenium-server-standalone-2.25.0.jar -htmlSuite “*firefox”

http://www.google.com&#8221; “C:\Selenium\1day_post_pure.html”

“C:\Selenium\TestResult.html”