Vagrant の CentOS で Selenium テストを回したい

# Vagrant の CentOS で Selenium テストを回したい
VagrantのCentOSでSeleniumを回してみたいと思い、色々と調べて試してみました。
Vagrant上のCentOSはそのままではSeleniumは動きません。
そのため仮想のGUI環境、ブラウザを別途用意する必要があります。
今回は

* 仮想のGUI環境…「Xvfb」
* ブラウザ…「firefox」

をそれぞれ用いて行っていきたいと思います。
下記は CentOS release 6.7 (Final) にて行っております。

参照：
[xvfbとfirefoxでseleniumをヘッドレスに起動する手順 - 文系プログラマによるTIPSブログ](http://www.bunkei-programmer.net/entry/2014/10/16/015439)
[Webページのスクリーンショットを撮る方法(Xvfb + Firefox + ImageMagick) - PukiWiki](http://www.lovebug.jp/index.php?Web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E6%92%AE%E3%82%8B%E6%96%B9%E6%B3%95(Xvfb%20%2B%20Firefox%20%2B%20ImageMagick))

### Xvfb と Firefox のインストール
まずは仮想のGUI環境であるXvfbとブラウザのFirefoxをインストールします。

* Javaのインストール
`sudo yum -y install java-1.7.0-openjdk.x86_64 java-1.7.0-openjdk-devel.x86_64`

* Xvfb と firefox のインストール
`sudo yum -y install xorg-x11-server-Xvfb firefox`

* ブラウザの文字化けを防ぐために日本語フォントをインストール
`sudo yum -y groupinstall "Japanese Support"`

### bash の設定変更
`sudo vi ~/.bash_profile`
にて以下の様に編集します。

```
# User specific environment and startup programs
export DISPLAY=:1
PATH=$PATH:$HOME/bin
```
上記の部分に`export DISPLAY=:1`を追加しています。

### Xvfbを起動する
`Xvfb :1 -screen 0 1024x768x24 > /dev/null &`
上記のコマンドでXvfbを起動します。
&を用いてバックグラウンド実行します

    [vagrant@localhost ~]$ Xvfb :1 -screen 0 1024x768x24 > /dev/null &
    [1] 4516
    [vagrant@localhost ~]$ _XSERVTransmkdir: ERROR: euid != 0,directory     /tmp/.X11-unix will not be created.
    Initializing built-in extension Generic Event Extension
    Initializing built-in extension SHAPE
    Initializing built-in extension MIT-SHM
    ~~~
    省略
    ~~~
    Initializing built-in extension XVideo-MotionCompensation
    Initializing built-in extension SELinux
    Initializing built-in extension GLX


### firefox を起動する
`firefox -display :1 -width 1024 -height 800 > /dev/null &`
上記のコマンドでfirefoxを実行します。

    [vagrant@localhost ~]$ 6 XSELINUXs still allocated at reset
    SCREEN: 0 objects of 256 bytes = 0 total bytes 0 private allocs
    DEVICE: 0 objects of 96 bytes = 0 total bytes 0 private allocs
    CLIENT: 0 objects of 144 bytes = 0 total bytes 0 private allocs
    ~~~
    省略
    ~~~
    1 CURSOR_BITSs still allocated at reset
    TOTAL: 0 objects, 0 bytes, 0 allocs
    Xlib:  extension "RANDR" missing on display ":1".


#### ＊補足 バックグラウンドで実行中のプログラムを確認する方法
`jobs`コマンドを使います

    [vagrant@localhost ~]$ jobs
    [1]-  実行中               Xvfb :1 -screen 0 1024x768x24 &
    [2]+  実行中               firefox &

### 画像ライブラリのImageMagickをインストール
`sudo yum install ImageMagick`コマンドでImageMagickをインストール。
これは画像のスクリーンショットなどをpng形式に変換する画像ライブラリです。
参考:[サーバーでWeb画面のスクリーンショットを取る - いしだ日記](http://d.hatena.ne.jp/ishidamakot/20110716/1310819584)

`import -window root screenshot.jpg`
を用いる事で現在のシステムのスクリーンショットを取得する事ができます。
-window オプションつけずに import を実行するとウィンドウや任意の領域をインタラクティブに選択する事ができます。
参考:[スクリーンショットの取得 - ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%AE%E5%8F%96%E5%BE%97) 

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/119381/66df5843-9d65-598a-e9c7-81c08cd1f68c.jpeg)
この様にcentosの画面のスクリーンショットが撮れる様になります。


### selenium のインストール
* selenium-sebdriverをインストール　`gem install selenium-webdriver`

* pipをインストール `sudo easy_install pip`

* selenium 本体をインストール `pip install selenium`

## 実行してみる
試しに以下のように、グーグル検索をかけ、
一番最初に出てきたページのurlとtitleを表示するコードを試してみました。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys

    serch_list = ["banana","strawberry","apple"]

    driver = webdriver.Firefox()
    driver.implicitly_wait(3)

    for list in serch_list:
	    driver.get("https://www.google.co.jp/")
	    driver.set_window_size(1024,800)
	    driver.find_element_by_name("q").send_keys(list)
	    time.sleep(2) 
	    driver.find_element_by_name("q").send_keys(Keys.RETURN)
	    print driver.find_element_by_xpath('//h3[@class="r"]//a').text,
	    print driver.find_element_by_xpath('//h3[@class="r"]//a').get_attribute("href")
    driver.quit()

`python test.py`にて実行すると

```
Banana Republic Japan Official Online Store ｜公式バナナ ... http://www.bananarepublic.co.jp/
strawberryの意味 - 英和辞典 Weblio辞書 http://ejje.weblio.jp/content/strawberry
Apple（日本） http://www.apple.com/jp/
```
きちんと実行されていました！

参考にさせていただいたサイトの皆様、ありがとうございました。
また上記の記事に不備不足などございましたら、何卒ご指導の程よろしくお願い致します。