■PHP版SeleniumでECCubeをテストする例
■テスト例
config.php
<?php
// 環境
define('ENVIRONMENT', 'gui');
//define('ENVIRONMENT', 'cui');
// Chromeドライバ
define('WEBDRIVER_FILE', './chromedriver.exe');
//define('WEBDRIVER_FILE', '/usr/local/bin/chromedriver');
// ブラウザのユーザーエージェント
define('USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36 Selenium');
// ブラウザの画面サイズ
define('SCREEN_WIDTH', 1280);
define('SCREEN_HEIGHT', 1024);
// 待機秒数
define('SLEEP_TIME', 1);
// スクリーンショット保存ディレクトリ
define('SCREENSHOT_DIR', './screenshots');
// 対象サイト
define('SITE_URL', 'http://203.0.113.1');
// サイト名
define('SITE_NAME', 'テスト店');
// 商品ページ
define('PRODUCT_PATH', '/products/detail/1');
// テスト用商品の名前
define('PRODUCT_NAME', '彩のジェラートCUBE');
// テスト用商品のオプション(設定されている場合)
define('PRODUCT_OPTION1_KEY', 'classcategory_id1');
define('PRODUCT_OPTION1_VALUE', 'チョコ');
define('PRODUCT_OPTION2_KEY', 'classcategory_id2');
define('PRODUCT_OPTION2_VALUE', '16mm × 16mm');
// テスト用商品の金額
define('PRODUCT_PRICE', '¥5,500');
test_eccube.php
<?php
require_once 'config.php';
require_once 'vendor/autoload.php';
use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverExpectedCondition;
if (php_sapi_name() !== 'cli') {
echo "ERROR: CLIで実行してください。\n";
exit;
}
// Chromeドライバを環境変数に設定
putenv('webdriver.chrome.driver=' . WEBDRIVER_FILE);
// ブラウザを設定
if (ENVIRONMENT === 'gui') {
$options = [
'--user-agent=' . USER_AGENT,
'--window-size=' . SCREEN_WIDTH . ',' . SCREEN_HEIGHT,
];
} else {
$options = [
'--headless',
'--disable-gpu',
'--user-agent=' . USER_AGENT,
'--window-size=' . SCREEN_WIDTH . ',' . SCREEN_HEIGHT,
];
}
$option = new ChromeOptions();
$option->addArguments($options);
$chrome = DesiredCapabilities::chrome();
$chrome->setCapability(ChromeOptions::CAPABILITY, $option);
// ブラウザを起動
$driver = ChromeDriver::start($chrome);
echo "テスト開始\n";
// 対象サイトへのアクセスをテスト
testSite(1);
// カートへの追加をテスト
testCart(2);
// 購入をテスト
testOrder(3);
// 対象サイトへのアクセスをテスト
testSite(4);
echo "テスト終了\n";
// ブラウザを閉じる
$driver->close();
exit;
// 対象サイトへのアクセスをテスト
function testSite($number)
{
global $driver;
echo '■テスト' . $number . "\n";
echo "\n";
// トップページへ遷移
$driver->get(SITE_URL);
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains(SITE_NAME));
sleep(SLEEP_TIME);
// 見出しテキストを取得
$text = $driver->findElement(WebDriverBy::cssSelector('h1'))->getText();
// 見出しテキストを出力
echo 'サイト名: ' . $text . "\n";
// 結果を判定
if ($text === SITE_NAME) {
echo "OK\n";
} else {
echo "NG\n";
}
// スクリーンショットを撮影
$driver->takeScreenshot(SCREENSHOT_DIR . '/' . $number . '_site.png');
echo "\n";
return;
}
// カートへの追加をテスト
function testCart($number)
{
global $driver;
echo '■テスト' . $number . "\n";
echo "\n";
// 商品ページへ遷移
$driver->get(SITE_URL . PRODUCT_PATH);
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains(PRODUCT_NAME));
sleep(SLEEP_TIME);
// オプションを選択
if (!empty(PRODUCT_OPTION1_KEY)) {
$driver->findElement(WebDriverBy::cssSelector('#' . PRODUCT_OPTION1_KEY))->click();
$driver->getKeyboard()->sendKeys(PRODUCT_OPTION1_VALUE);
}
if (!empty(PRODUCT_OPTION2_KEY)) {
$driver->findElement(WebDriverBy::cssSelector('#' . PRODUCT_OPTION2_KEY))->click();
$driver->getKeyboard()->sendKeys(PRODUCT_OPTION2_VALUE);
}
// 商品をカートへ追加
$driver->findElement(WebDriverBy::cssSelector('.ec-layoutRole__main .ec-blockBtn--action'))->click();
// 「カートへ進む」ボタンが表示されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::elementToBeClickable(WebDriverBy::cssSelector('.ec-layoutRole__main .ec-inlineBtn--action')));
// 「カートへ進む」ボタンをクリック
$driver->findElement(WebDriverBy::linkText('カートへ進む'))->click();
//$driver->findElement(WebDriverBy::cssSelector('.ec-inlineBtn--action'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains('現在のカゴの中'));
sleep(SLEEP_TIME);
// カート内の合計金額を取得
$text = $driver->findElement(WebDriverBy::cssSelector('.ec-layoutRole__main .ec-cartRole__totalAmount'))->getText();
// カート内の合計金額を出力
echo 'カート内の合計金額: ' . $text . "\n";
// 結果を判定
if ($text === PRODUCT_PRICE) {
echo "OK\n";
} else {
echo "NG\n";
}
// スクリーンショットを撮影
$driver->takeScreenshot(SCREENSHOT_DIR . '/' . $number . '_cart.png');
echo "\n";
return;
}
// 購入をテスト
function testOrder($number)
{
global $driver;
echo '■テスト' . $number . "\n";
echo "\n";
// 「レジに進む」ボタンをクリック
$driver->findElement(WebDriverBy::linkText('レジに進む'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains('商品購入ログイン'));
sleep(SLEEP_TIME);
// 「ゲスト購入」ボタンをクリック
$driver->findElement(WebDriverBy::linkText('ゲスト購入'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains('非会員購入情報入力'));
sleep(SLEEP_TIME);
// お客様情報の入力
$driver->findElement(WebDriverBy::cssSelector('#nonmember_name_name01'))->click();
$driver->getKeyboard()->sendKeys('山田');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_name_name02'))->click();
$driver->getKeyboard()->sendKeys('太郎');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_kana_kana01'))->click();
$driver->getKeyboard()->sendKeys('ヤマダ');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_kana_kana02'))->click();
$driver->getKeyboard()->sendKeys('タロウ');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_postal_code'))->click();
$driver->getKeyboard()->sendKeys('5300001');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_address_pref'))->click();
$driver->getKeyboard()->sendKeys('大阪府');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_address_addr01'))->click();
$driver->getKeyboard()->sendKeys('大阪市北区梅田');
sleep(SLEEP_TIME);
$driver->findElement(WebDriverBy::cssSelector('#nonmember_address_addr02'))->click();
$driver->getKeyboard()->sendKeys('1-1-1');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_phone_number'))->click();
$driver->getKeyboard()->sendKeys('0611111111');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_email_first'))->click();
$driver->getKeyboard()->sendKeys('refirio.work+taro@gmail.com');
$driver->findElement(WebDriverBy::cssSelector('#nonmember_email_second'))->click();
$driver->getKeyboard()->sendKeys('refirio.work+taro@gmail.com');
// 「次へ」ボタンをクリック
$driver->findElement(WebDriverBy::cssSelector('.ec-layoutRole__main .ec-blockBtn--action'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains('商品購入'));
sleep(SLEEP_TIME);
// お支払い方法の選択
$driver->findElement(WebDriverBy::cssSelector('#shopping_order_Payment_3'))->click();
sleep(SLEEP_TIME);
// お問い合わせの入力
$driver->findElement(WebDriverBy::cssSelector('#shopping_order_message'))->click();
$driver->getKeyboard()->sendKeys("テスト。\nこれはSeleniumでの購入テストです。");
// 「確認する」ボタンをクリック
$driver->findElement(WebDriverBy::cssSelector('.ec-layoutRole__main .ec-blockBtn--action'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains('商品購入/ご注文確認'));
sleep(SLEEP_TIME);
// 「注文する」ボタンをクリック
$driver->findElement(WebDriverBy::cssSelector('.ec-layoutRole__main .ec-blockBtn--action'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains('商品購入/ご注文完了'));
sleep(SLEEP_TIME);
// カート内の合計金額を出力
echo "購入完了画面\n";
echo "OK\n";
// スクリーンショットを撮影
$driver->takeScreenshot(SCREENSHOT_DIR . '/' . $number . '_order.png');
// 「トップページへ」ボタンをクリック
$driver->findElement(WebDriverBy::linkText('トップページへ'))->click();
// 遷移されるまで待つ
$driver->wait()->until(WebDriverExpectedCondition::titleContains(SITE_NAME));
sleep(SLEEP_TIME);
echo "\n";
return;
}
■参考
PHPUnit_Extensions_Selenium2TestCase での各種HTML操作 - Qiita
https://qiita.com/84q/items/a0459c03d12315dfd1e8
PHPUnit + php-webdriver でWebUIのテストを書く - Qiita
https://qiita.com/zaburo/items/f11357170953a3c34b8f
自動テストでリンクをクリックして別ページへ移動したい場合 | ハックノート
https://hacknote.jp/archives/44778/
HowTo Wait - php-webdriver/php-webdriver Wiki
https://github.com/php-webdriver/php-webdriver/wiki/HowTo-Wait?_fsi=T0Igv1am
selenium + php-webdriver で フルスクリーンキャプチャをとる - Qiita
https://qiita.com/ooyama91/items/6053da5a106e388bd807
PHP Selenium Webdriver (Facebook wrapper)で特定のelementまでscrollする | ハックノート
https://hacknote.jp/archives/45317/
Selenium php-webdriverでよく使うChromeオプション - Qiita
https://qiita.com/reonal/items/b60f7bcf62cfdef5cea7