Memo

メモ > 技術 > 開発: Selenium > PHP版SeleniumでECCubeをテストする例

■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

Advertisement