php-webdriverをWindowsのローカルで試す

投稿日:

小学校とか幼稚園とかの行事に参加する度に日焼けに悩まされています。
この時期は外でも地味に調子こけるからそれが辛い。

さて、前回( 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

Pocket

スポンサーリンク

コメントを残す

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