php-webdriverを簡単に試せるライブラリ書いた

投稿日:

自由研究が終わっていない!やばい!となって週末全力で息子の宿題をお手伝いしました。
このへんは血が争えないというか、やはりこうなってしまうんだなぁと歴史というか、得体の知れない何かを実感しました。

というわけで、先日までちょくちょくとphp-webdriverを触っていたのですが自分の中である程度まとまったのでライブラリ化しました。
名前はpmdです(php-webdriver → pwd → ひっくり返して → pmd)。

2017/09/02 追記


名前、最初気にしてなかったけどやっぱり気になったので変えました。

screru(スクレル) です。
(スクリーンショットが撮れる → screenshot ga toreru → screru)

2017/09/02 追記ここまで

といっても大層なものでもなく、自分自身が欲しいなぁという機能をラップして組み込んだものになります。

入れた機能としては以下の通りです。

  • PHPUnit用に組み込める関数群をTraitとして用意
  • 画面のフルスクリーンキャプチャ
    • 後述しますが、テスト(assertion)失敗時にキャプチャを撮る仕組みもあります
  • 指定要素のキャプチャ

対応ブラウザは、

  • Firefox
  • Chrome
  • Internet Explorer (windows)

のみとなっています(いまのところ)。

使い方

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\Testableuseしたのち、プロパティ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テスト書くぞ!

Pocket

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です