4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP2.xとBehatとSelenium2とPhantomJSでJavascriptアラートをテストする方法

Last updated at Posted at 2015-11-24

Behat(Bddプラグイン)とSeleniumでJavascriptのアラートをチェックする方法がやっとわかったので、メモ。
情報はボチボチでていたものの、タイトルに有るような環境でのビッタリな答えが見つけられなかったので、自分なりに試行錯誤した結果です。

結果から言うと、「テストは可能だがちょっと無理やり感がある」って感じでした。
Selenium2だけだと、Javascriptのアラート関係に対応していなかったので、
ヘッドレスブラウザのPhantomJSで実現します。

インストールするもの

  • Behat
  • Mink
  • Selenium2WebDriver
  • PhantomJS

手順

1 初期化します

$ app/Console/cake Bdd.story

2 featureを書きます

  もし jsで "/xxxx/xxxx/" を表示している
  ならば jsでアラートの文字が "名前を入力して下さい" となっているかチェックする

3 ステップファイルを作ってコードを書く(steps/step_xxx.php)

$steps->Given('/^jsでアラートの文字が "([^"]*)" となっているかチェックする$/', function($world, $arg1) {
    if(!$world->checkAlertMessage($arg1)) {
        // テストが通らなかったら、エラーを投げる
        throw new ErrorException();
    }
});

4 実際の処理を[bootstrap/FeatureContext.php]に書きます

function __constructに以下を。

// ドライバの初期化
$host = CI_HOST . ":8910/wd/hub";
$browser = "phantomJS";
$this->gui = new Mink(array(
'javascript' => new Session(new Selenium2Driver($browser, null, $host)),
));

適当な場所に以下の2つのメソッドを書く。

// Javascriptでアラートの文字を拾う準備をする
public function presetGetAlertMessage()
{
    // Alertの文字を拾う(クリックの前に入れておく)
    $this->gui->getSession('javascript')->getDriver()->evaluateScript(
    "
    (function () {
        var lastAlert = undefined;
        window.alert = function (message) {
            lastAlert = message;
        };
        window.getLastAlert = function () {
            var result = lastAlert;
            lastAlert = undefined;
            return result;
        };
    }());
    "
    );
}

// Javascriptのアラートメッセージをチェック
public function checkAlertMessage($message)
{
    $getMessage = $getMessage = $this->gui->getSession('javascript')->getDriver()->evaluateScript(
        "return window.getLastAlert()"
    );
    // チェック
    if($getMessage === $message) {
        return true;
    } else {
        return false;
    }
}

5 PhantomJSを起動する

$ phantomjs --webdriver=8910

phantomjsは、バックグランド実行するか、別窓コンソールで実行する

6 Behatを実行する

$ ./app/Console/cake Bdd.story

##ポイントはブラウザの切り替え

ブラウザの概念がわからなかったのですが、要は、もともとあったテスト用ブラウザ(Firefoxかな?)と、PhantomJSというブラウザの2枚があり、前者だと、Javascriptがうまく使えない。なので、都度ブラウザをPhantomJSに変えましょう、ということらしい。

今回だと、「jsで〜」とつけたものはPhantomJSで実行するように作った。
ブラウザが変わると、もちろんデータ等は保持されないので、エラーがでまくる。
その辺がわからずにずっとハマってしまっていました。

参考書籍・サイト

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?