ブラックボックス

プログラミングのノウハウやライフハックをどんどん投稿していきたい

Jun 14, 2013 - 2 minute read - ノウハウ

【Selenium2+PHPUnit】処理が終わるまでタイムアウトをしない

やっとPHPUnitでAndroidのWebdriverを操作できるように。
近々まとめたいですが、中々まとまった時間が取れなくてまとめられない……。

今回は、Androidでどうしてもタイムアウトが起こってしまいテストが出来なかったので、
sleepを使わずに、PHPUnitで用意されているWait関数を使用して処理を待つ方法。
Android用ではないので、PCブラウザでも利用可能。

Googleで任意の文字をテキストボックスに打ち、それを検索するテストスクリプトを作りました。

Sp.php

<?php
require_once 'PHPUnit/Extensions/Selenium2TestCase.php';

class Sp extends PHPUnit_Extensions_Selenium2TestCase
{
    protected function setUp()
    {
        $this->setHost("localhost");
        $this->setPort(8080);
        $this->setBrowser("android");
        $this->setBrowserUrl("http://www.google.co.jp/");
    }
 
    public function testTitle()
    {
        $this->url('/');
        $this->byName('q')->value('test');
        $this->byName('gs')->submit();
    }
}

上記を実行したところ、以下のエラーが発生。

PHPUnit 3.7.21 by Sebastian Bergmann.

E

Time: 18 seconds, Memory: 2.00Mb

There was 1 error:

  1. Sp::testTitle
    PHPUnit_Extensions_Selenium2TestCase_WebDriverException: Could not find element
    with name: q
    For documentation on this error, please visit: http://seleniumhq.org/exceptions/
    no_such_element.html
    Build info: version: ‘unknown’, revision: ‘unknown’, time: ‘unknown’
    System info: os.name: ‘Linux’, os.arch: ‘armv7l’, os.version: ‘2.6.29-g46b05b2’,
    java.version: ‘0’
    Driver info: driver.version: EventFiringWebDriver

C:\testcase\Sp.php:17
C:\testcase\Sp.php:17

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

Could not find element
with name: q

どうもページの表示にえらい時間がかかってしまい、「q」というName属性のエレメントが見つからない様子。
16行目の後にsleepを入れれば、まあ一応解決はしますが、それだとなんだかイケてないので、
PHPUnitで用意されているWait関数を使うことに。

以下に改良。

<?php
require_once 'PHPUnit/Extensions/Selenium2TestCase.php';

class Sp extends PHPUnit_Extensions_Selenium2TestCase
{
    protected function setUp()
    {
        $this->setHost("localhost");
        $this->setPort(8080);
        $this->setBrowser("android");
        $this->setBrowserUrl("http://www.google.co.jp/");
    }
 
    public function testTitle()
    {
        $this->waitUntil(function() {
            $this->url('/');
            $this->byName('q')->value('test');
            $this->byName('gs')->submit();
            return true;
        }
        , 50000);
    }
}

$this->waitUntil(実行関数, タイムアウト時間(ms));

PHP5.3以上なので、実行関数には無名関数を設定。
第2引数に50000と設定をしたので、第1引数の処理が終わるか、50秒経つまで待つ仕組み。
実行が終わるか50秒の早いほうまでWaitなので、sleep(50)を行うよりも高速に実行が可能。

ということで実行。

PHPUnit 3.7.21 by Sebastian Bergmann.

.

Time: 35 seconds, Memory: 3.25Mb

OK (1 test, 0 assertions)

無事テストをクリアしました。