Seleniumで画像を取得する(キャプチャを使わない)
captureEntirePageScreenshotがfirefox以外だとうまく動かないが、firefoxはnetbeansからだとなぜか実行できないので自前でHTML内にある全ての画像を落とすようにした。どうせエビデンス取らなきゃいけないしページが長い場合はスクロールしなきゃいけないけどようわからんので画像ファイルで落とせればいいや、というかんじ。
HTMLファイル
<html> <body> <img id="smp" src="./sample.png"> </body> </html>
ひとまず画像だけが置いてあるHTML
テストファイル
なお、phpunit-seleniumを使用しております。本心としてはPHPUnit_Extensions_SeleniumTestCaseクラスを継承したPHPUnit_Extensions_VerifyTestCaseを作成して、そこにsaveImageメソッドを作成してどこでも使えるようにする。
テストケースはやっぱりテストケースで分類すべきだよなとちょっと思ったので。ホントはちゃんと名前空間柄使ったほうがいいんだろうけどめんどいので省略。
SaveImageTest.php
<?php require_once __DIR__. '/PHPUnit_Extensions_VerifyTestCase'; class indexTest extends PHPUnit_Extensions_VerifyTestCase { function setUp() { $this->setBrowser("*googlechrome C:\Program Files\Google\Chrome\Application\chrome.exe"); $this->setBrowserUrl("http://localhost/index.php"); } function testGetImage() { $this->open("http://localhost/index.php"); //assertは一個くらいいれておく $this->assertElementPresent("id=smp"); //指定したページの画像ファイルだけを保存する。第一引数がURL, 第二引数は保存するディレクトリパス $this->saveImage("http://localhost/index.php", __DIR__); $this->close(); } }
PHPUnit_Extensions_VerifyTestCase.php
ついでなのでphpUnit-Seleniumに定義されていないverifyなんとかメソッドとかもここに定義してしまおうと思っている。verifyじゃなくてcustomとかにしたほうがいいのかね。まあいいか。
<?php require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; class PHPUnit_Extensions_VerifyTestCase extends PHPUnit_Extensions_SeleniumTestCase { public function saveImage($url, $dir = __DIR__){ //時間がかかる場合にタイムアウトしないように念のため0にセット set_time_limit(0); //<img ~>タグを検索 preg_match_all('/(<img+(.*?)+>)/i',file_get_contents($url), $matches); //重複を削除する $getArr = array_unique($matches[0]); foreach($getArr as $tag) { //<img ~>タグの中身をとりあえず空白で分割する $imgTagArr = explode(" ", $tag); //空白で分割したものの中からsrc="~"というのを探す foreach($imgTagArr as $item) { if(strstr($item, "src") != false){ //srcが見つかったらファイル名を取得し抜ける $path = explode("\"", $item); break; } } //画像ファイル拡張子がついているかどうかを調べる if(preg_match("/(jpg|gif|png)$/i", $path[1])) { //ファイルを取得するURLを作成し直す $urlReplacePos = strrpos($url, "/"); $urlFile = substr($url, 0, $urlReplacePos+1) . $path[1]; //保存ディレクトリ名を生成し、作る $dirPath = $dir. "/". date("Ymd_His"); mkdir($dirPath); //ファイルに書き込み file_put_contents($dirPath. "/". basename($path[1]), file_get_contents($urlFile)); } } } }
こんな感じ。