自由研究が終わっていない!やばい!となって週末全力で息子の宿題をお手伝いしました。
このへんは血が争えないというか、やはりこうなってしまうんだなぁと歴史というか、得体の知れない何かを実感しました。
というわけで、先日までちょくちょくとphp-webdriver
を触っていたのですが自分の中である程度まとまったのでライブラリ化しました。
名前はpmdです(php-webdriver → pwd → ひっくり返して → pmd)。
公開しました。 | shimabox/pmd: pmd is a library that supplements php-webdriver. https://t.co/OI6FCGRLQt
— しまぶ (@shimabox) August 30, 2017
2017/09/02 追記
pmd、静的解析系のライブラリと名前が同じなのやっぱり気になるので名前を変えました | shimabox/screru: screru is a library that supplements php-webdriver. https://t.co/jBGOLeZ6iR
— しまぶ (@shimabox) September 2, 2017
名前、最初気にしてなかったけどやっぱり気になったので変えました。
screru(スクレル) です。
(スクリーンショットが撮れる → screenshot ga toreru → screru)
2017/09/02 追記ここまで
といっても大層なものでもなく、自分自身が欲しいなぁという機能をラップして組み込んだものになります。
入れた機能としては以下の通りです。
- PHPUnit用に組み込める関数群をTraitとして用意
- 画面のフルスクリーンキャプチャ
- 後述しますが、テスト(assertion)失敗時にキャプチャを撮る仕組みもあります
- 指定要素のキャプチャ
対応ブラウザは、
- Firefox
- Chrome
- Internet Explorer (windows)
のみとなっています(いまのところ)。
https://github.com/shimabox/screru
使い方
seleniumや各ドライバーのインストールなどは、
のREADME.md
を参考にしてもらうとして簡単な使い方を書きます。
簡単な使い方
.env
の設定
- CentOSの場合
ENABLED_FIREFOX_DRIVER
を true にします(デフォルトtrueです)
ENABLED_FIREFOX_DRIVER=true
- macOSの場合
ENABLED_FIREFOX_DRIVER
を true にします(デフォルトtrueです)ENABLED_CHROME_DRIVER
を true にします
ENABLED_FIREFOX_DRIVER=true ENABLED_CHROME_DRIVER=true
- windowsの場合
ENABLED_FIREFOX_DRIVER
を true にします(デフォルトtrueです)ENABLED_CHROME_DRIVER
を true にしますENABLED_IE_DRIVER
を true にしますIS_PLATFORM_WINDOWS
を true にしますFIREFOX_DRIVER_PATH
に geckodriver.exe のパスを書きますCHROME_DRIVER_PATH
に chromedriver.exe のパスを書きますIE_DRIVER_PATH
に IEDriverServer.exe のパスを書きます
ENABLED_FIREFOX_DRIVER=true ENABLED_CHROME_DRIVER=true ENABLED_IE_DRIVER=true // true to platform is windows IS_PLATFORM_WINDOWS=true // webdriver path for IE FIREFOX_DRIVER_PATH='your geckodriver.exe path' CHROME_DRIVER_PATH='your chromedriver.exe path' IE_DRIVER_PATH='your IEDriverServer.exe path'
- SeleniumServerのURLを変更する場合
SELENIUM_SERVER_URL
にSeleniumServerのURLを書きます- デフォルトは
http://localhost:4444/wd/hub
ですSELENIUM_SERVER_URL='http://localhost:4444/wd/hub'
- デフォルトのUserAgentを変える場合
OVERRIDE_DEFAULT_USER_AGENT
に変更したいUserAgentを書きます- デフォルトは
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML. like Gecko) Version/10.0 Mobile/14F89 Safari/602.1
(iOS10) ですOVERRIDE_DEFAULT_USER_AGENT='xxxxxxx'
seleniumの立ち上げ
- seleniumを立ち上げておきます
$ java -jar selenium-server-standalone-3.4.0.jar
- ※CentOSの場合
$ java -jar selenium-server-standalone-3.3.1.jar
サンプル実行
$ php example/example_1.php
※ これはdemo用で、Firefoxを立ち上げたものになります
エラーも無く処理が終わって、example/capture/
以下に全画面のキャプチャ(xxxxx_full.png)及び、指定要素のキャプチャ(xxxxx_x_x.png)が出力されていればOKです。
PHPUnitに組み込む
PHPUnit用のTrait\SMB\Screru\Traits\Testable
を用意しているので以下のように組み込みます。
### \PHPUnit_Framework_TestCase を継承したクラスでuseしください ###
class Sample extends \PHPUnit_Framework_TestCase { // use Trait use \SMB\Screru\Traits\Testable { setUp as protected traitSetUp; tearDown as protected traitTearDown; } /** * setUp */ protected function setUp() { $this->traitSetUp(); } /** * tearDown */ protected function tearDown() { $this->traitTearDown(); } // do somting ... }
テスト(assertion)失敗時にキャプチャを撮る
上記のTrait\SMB\Screru\Traits\Testable
をuse
したのち、プロパティtakeCaptureWhenAssertionFails
の値をtrueにします。
class Sample extends \PHPUnit_Framework_TestCase { // use Trait use \SMB\Screru\Traits\Testable { setUp as protected traitSetUp; tearDown as protected traitTearDown; } // Set this property to true protected $takeCaptureWhenAssertionFails = true; /** * setUp */ protected function setUp() { $this->traitSetUp(); } /** * tearDown */ protected function tearDown() { $this->traitTearDown(); } // do somting ... }
こうしておくと、テスト失敗時にtests\capture\fail
以下へテスト失敗時の画面キャプチャを撮って配置します。
とりあえず簡単な使い方は以上になります。
課題
ひとまずの課題として、Linux環境できちんと動かしたいというのがあります。
(手元の環境では、CentOS6.8のfirefoxでしか確認できていません。。)
(ローカルで実行するとブラウザがもってかれる。。)
いずれ、CentOS7でchromedriverを入れてテスト流したいと思います。
※ CentOS6でchromedriver動かすの修羅の道っぽい
おわりに
要素を探してだとかクリックしてだとか全画面キャプチャとか、そういった簡単なテストはまかなえるのではないかと思います。
(このライブラリで足りない処理は、php-webdriver
が提供しているメソッドをそのまま使えばよいと思います)
微妙な点としては、やはり処理が遅いので根気が必要です!!
(selenium側でタイムアウトになったりだとか)
また、seleniumとドライバーのバージョンの組み合わせによっては上手く動かない処理があったりするのでそのあたりは適宜バージョンを変えながら試してみてください。
e2eテスト書くぞ!
上記内容で動作しないケースがあったら
こちらの記事を参考にして頂けると解決するかもしれません。
php-webdriverのラッパーライブラリ”screru”のバージョンをあげた – Shimabox Blog