小学校とか幼稚園とかの行事に参加する度に日焼けに悩まされています。
この時期は外でも地味に調子こけるからそれが辛い。
さて、前回( php-webdriverをmacのローカルで試す )はローカルのMacでphp-webdriverを使ってseleniumを動かしてみましたが、今回はみんな大好きWindowsを使ってみたいと思います。
※ WindowsなのでもちろんIEも動かせます
といっても、Macで試したときとそんなに違いはありません。
環境
環境ですが、
- Windows 7 Professional
- php
- PHP 5.6.23 (cli) (built: Jun 22 2016 12:15:20)
- xampp を使いました
php-webdriver
は PHPのバージョンが5.5 以上であれば大丈夫です
- java jdk
- 1.8.0_77
- javaは 1.8 以上であれば大丈夫です
自分はこんな感じです。
とりあえず、PHP(>=5.5) と Java(>=1.8) が入っていればよいと思います。
利用するブラウザ
利用するブラウザのバージョンは以下の通りです。
- Chrome
- 59.0.3071.86 (Official Build) (64 ビット)
- ヘッドレスじゃないよ!
- Firefox
- 53.0.3 (64 ビット)
- ※ 32 ビット版でも大丈夫だと思います
- IE
- 11.0.9600.18537
php-webdriverを実行するために必要なもの
まずphp-webdriverを実行するために、以下が必要になりますので
- selenium-server-standalone
- v3.4.0
- geckodriver.exe
- v0.16.1
- chromedriver.exe
- v2.30
- IEDriverServer.exe
- v3.4.0
これらをそれぞれダウンロードします。
※ バージョンはこの記事を書いた時点(2017/06/09)でのものになりますので適宜確認してください
selenium-server-standalone のダウンロード
http://selenium-release.storage.googleapis.com/index.html?path=3.4/ から
selenium-server-standalone-3.4.0.jar をダウンロードします。
geckodriver のダウンロード
Firefox47以降は、FirefoxDriverではなくgeckodriverを使用するようです。
Release v0.16.1 · mozilla/geckodriver から geckodriver-v0.16.1-win64.zip をダウンロードして解凍します。
geckodriver.exe がドライバーになります。
chromedriver のダウンロード
https://chromedriver.storage.googleapis.com/index.html?path=2.30/ から chromedriver_win32.zip をダウンロードして解凍します。
chromedriver.exe がドライバーになります。
IEDriverServer のダウンロード
http://selenium-release.storage.googleapis.com/index.html?path=3.4/ から
IEDriverServer_x64_3.4.0.zip をダウンロードして解凍します。
IEDriverServer.exe がドライバーになります。
php-webdriverのインストール
ここまでで、実行環境は整ったはずなのでphp-webdriver
をインストールします。
といっても、Composer
で一発です。
※ Composerって何?という人はググってみてください
$ composer require facebook/webdriver
これでおkです。
IEをphp-webdriverとseleniumで操作してみる
では、サンプルとしてIEを動かしてみます。
上記でダウンロードした selenium-server-standalone-3.4.0.jar
,
IEDriverServer.exe
を使います。
サンプル用ソース
以下のソースを用意します。
sample.php
<?php require_once 'vendor/autoload.php'; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Remote\DesiredCapabilities; use Facebook\WebDriver\WebDriverExpectedCondition; use Facebook\WebDriver\WebDriverBy; // selenium $host = 'http://localhost:4444/wd/hub'; // driver $driver = RemoteWebDriver::create($host, DesiredCapabilities::internetExplorer()); // 画面サイズをMAXに $driver->manage()->window()->maximize(); // 指定URLへ遷移 (Google) $driver->get('https://www.google.co.jp/'); // 検索Box $element = $driver->findElement(WebDriverBy::name('q')); // 検索Boxにキーワードを入力して $element->sendKeys('もう梅雨ですね'); // 検索実行 $element->submit(); // 検索結果画面のタイトルが 'もう梅雨ですね - Google 検索' になるまで10秒間待機する // 指定したタイトルにならずに10秒以上経ったら // 'Facebook\WebDriver\Exception\TimeOutException' がthrowされる $driver->wait(10)->until( WebDriverExpectedCondition::titleIs('もう梅雨ですね - Google 検索') ); // もう梅雨ですね - Google 検索 というタイトルが取得できることを確認する if ($driver->getTitle() !== 'もう梅雨ですね - Google 検索') { throw new Exception('fail'); } // キャプチャ $driver->takeScreenshot('ie_sample.png'); // ブラウザを閉じる $driver->close();
ディレクトリ構成
こんなディレクトリ構成を想定しています。
|--composer.json |--composer.lock |--IEDriverServer.exe |--sample.php |--selenium-server-standalone-3.4.0.jar |--vendor | |--autoload.php | |--composer | |--facebook | | |--webdriver ・ ・
selenium-server-standalone の起動
コマンドプロンプトなどを開いて-Dwebdriver.ie.driver
に上記でダウンロードしたIEDriverServer.exe
のパスを指定してseleniumを起動します
$ java -Dwebdriver.ie.driver=IEDriverServer.exe -jar selenium-server-standalone-3.4.0.jar
実行
実行します。
(別のコマンドプロンプトなどを立ち上げます)
$ php sample.php
無事にIEが起動して、エラーもなく動けば成功です。
エラーが出た場合は以下を参考にしてみてください。
エラーが出てIEのテストにこける
IEをSeleniumで操作する時に一手間をかけないと下記のエラーが出ます。
セキュリティゾーンの保護モードを統一しろ
- PHPUnitのエラー
Fatal error: Uncaught exception 'Facebook\WebDriver\Exception\NoSuchDriverException' with message 'Unexpected error launchin g Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same v alue (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information)
- selenium のエラー
WARN - Exception: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information)
インターネットオプションのセキュリティゾーンの保護モードをすべて統一 (インターネット, ローカル イントラネット, 信頼済みサイト, 制限付きサイト) します。
※ すべてオンまたはすべてオフ (保護モードを有効にするのチェックボックス)
セキュリティの警告タブが出る
httpからhttpsのページに行く場合、こんな感じでセキュリティの警告タブがでるので
こんな感じで、今後、この警告を表示しないにチェックを入れて再度実行します。
または、
インターネットオプション -> 詳細設定タブ -> セキュリティ -> 保護付き/保護なしのサイト間を移動する場合に警告する のチェックボックス
のチェックを外して再度実行します。
セキュリティの警告タブを再度表示させるようにする
インターネットオプション -> 詳細設定タブ -> セキュリティ -> 保護付き/保護なしのサイト間を移動する場合に警告する のチェックボックスにチェックを入れると警告を再び出せるようになります
上記を踏まえて各ブラウザで実行
サンプル用のコードを落とす
拙作ですが shimabox/sample-phpwebdriver: Test with phpunit and phpwebdriver を使います。
※ vlucas/phpdotenv を使うので、.env
ファイルが必要です
$ git clone https://github.com/shimabox/sample-phpwebdriver.git $ cd sample-phpwebdriver $ composer install --dev // 既にある人は comoposer update $ cp .env.example .env
.env
// true to enable ENABLED_CHROME_DRIVER=true ENABLED_FIREFOX_DRIVER=true ENABLED_IE_DRIVER=true // true to platform is windows IS_PLATFORM_WINDOWS=true // webdriver path for IE CHROME_DRIVER_PATH='your chromedriver.exe path' FIREFOX_DRIVER_PATH='your geckodriver.exe path' IE_DRIVER_PATH='your IEDriverServer.exe path'
※ Windows以外は IS_PLATFORM_WINDOWS
の値を空(true以外)にしてください
サンプル実行
$ php sample/sample_4_win_64bit.php
chrome, firefox, IE の順に起動されてエラーが無ければ成功です。
課題
上記のサンプル sample_4_win_64bit.php
ではあえて、画面サイズを変更しているのですがキャプチャの結果を見てみると
- capture/sample_4_chrome.png
- 指定されたサイズのままキャプチャ
- capture/sample_4_firefox.png
- 指定されたサイズのままキャプチャ
- capture/sample_4_ie.png
- フルスクリーン?でキャプチャ
このようにバラバラです。
キャプチャ周りは前回も調べると言って調べていないので今度調べてみます(多分)。
まとめ
Windowsでもphp-webdriverとseleniumでE2Eテストが書けるぞ。
(簡単なケースしか試していないけど)
なお、php-webdriverのwikiはこちらです。
https://github.com/facebook/php-webdriver/wiki
上記内容で動作しないケースがあったら
こちらの記事を参考にして頂けると解決するかもしれません。
php-webdriverのラッパーライブラリ”screru”のバージョンをあげた – Shimabox Blog