php-webdriverで任意のラジオボタンをチェックする


前回より引き続き、Seleniumとphp-webdriverのメモ


例えば、

<a href="sample.html" id="link">リンク</a>

というコードがあったとします。


このリンクをクリックして他のページに遷移したい場合は、

php-webdriverでは、

$driver->getElement(WebDriverBy::linkText("リンク"))->click();
$driver->getElement(WebDriverBy::id("link"))->click();
$driver->getElement(WebDriverBy::xpath("//a[@href='sample.html']"))->click();

この3パターンがあります。

※もう一つ、テキスト部分の部分一致で指定する方法もありますが、今回は割愛します。


リンクといえば、

頻繁に使われる記述として、




<a href="sample.html" target="_blank">リンク</a>

のようにtarget="_blank"付きで、別ウィンドウなり別タブを開いて遷移先のページを表示するものがあります。


Seleniumではtarget="_blank"付きで開いたとしても、

開いた後は自動で新しいページにフォーカスが向くのではなく、

フォーカスを向けるためのコードが必要です。


というわけで公式ページを確認してみたら、

$driver->switchTo()->window(end($driver->getWindowHandles()));

このように記述されていたので、


$driver->getElement(WebDriverBy::linkText("リンク"))->click();
$driver->switchTo()->window(end($driver->getWindowHandles()));

このように書いて実行してみたら、

PHP Notice:  Only variables should be passed by reference in (以下省略)

エラーになりました。


これはPHP側の書き方の問題なので、

$wins = $driver->getWindowHandles();
$driver->switchTo()->window(end($wins));

endの中を一旦変数に放り込んでみてからスイッチしてみるようにしたらできた。




別タブで一通りのテストが終わったら、別タブを閉じ、元のタブに戻らなければ、後のテストを行う際にスマートではありません。

というわけで、別タブを閉じて、元のタブにフォーカスを当てる関数を作成してみた。


//タブを閉じる
function close(Facebook\WebDriver\Remote\RemoteWebDriver $driver){
	$wins = $driver->getWindowHandles();
	//2個以上タブを開いている時は、ドライバーをもう一つのタブにしてからタブを閉じる
	if(count($wins) > 1){
		$oldDriver = $driver;
		$oldDriver->close();
		$driver = $driver->switchTo()->window(array_shift($wins));
	}else{
		$driver->close();
	}
}

close($driver);

追記

テスト終了時、close($driver)でブラウザを閉じて終わりかと思っていたけれども、

Seleniumのconsoleにテストのセッションが残ってしまい、

何度もテストを実行するとメモリ不足でテストが失敗になる。


テストを終了させる時は、$driver->close();ではなく、$driver->quit();にしなければならない。

それを踏まえた上で、

//タブを閉じる
function close(Facebook\WebDriver\Remote\RemoteWebDriver $driver){
	$wins = $driver->getWindowHandles();
	//2個以上タブを開いている時は、ドライバーをもう一つのタブにしてからタブを閉じる
	if(count($wins) > 1){
		$oldDriver = $driver;
		$oldDriver->close();
		$driver = $driver->switchTo()->window(array_shift($wins));
	}else{
		//タブが一つの場合はquitを実行
		$driver->quit();
	}
}

close($driver);

ブラウザで開いているタブが一つの場合はquit()にして、作成したclose関数でテストを終了できるようにした。