Memo

メモ > 技術 > 開発: Selenium

■Selenium
以下はだいぶ後になってから読んだ記事 Seleniumのハマりどころなどが紹介されている クロスブラウザテストの闇と闇と闇 - Speaker Deck https://speakerdeck.com/tsuemura/kurosuburauzatesutofalsean-toan-toan
■PHP版Selenium環境をWindowsに構築
PHPでブラウザ自動化 - Qiita https://qiita.com/tsuuuuu_san/items/61379b797878d0e0f4d7 PHPUnit + php-webdriver でWebUIのテストを書く - Qiita https://qiita.com/zaburo/items/f11357170953a3c34b8f PHPUnit_Extensions_Selenium2TestCase での各種HTML操作 - Qiita https://qiita.com/84q/items/a0459c03d12315dfd1e8 Selenium webdriverメソッド~PHP~ - Qiita https://qiita.com/yukanashi/items/9c32891171dd09c40be2 php-webdriverでconfirmダイアログをクリックする - saitodev.co https://saitodev.co/article/php-webdriver%E3%81%A7confirm%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%... selenium - seleniumで要素取得したいが,2つ同名のものがあるため,後者を選択できない - スタック・オーバーフロー https://ja.stackoverflow.com/questions/67300 上記のページを参考に、JavaScriptでテストを作成&実行する 以下を作業フォルダとする C:\localhost\home\selenium\public_html ■XAMPPを導入 XAMPPを導入しておく(すでにインストールしている場合は不要) Windows内のブラウザを操作するために使うので、Vagrant環境があっても別途Windows上にPHPが必要 以降の解説では、
C:\xampp\php\php.exe -v
でPHPを実行できるようにしたと仮定する PHPをより簡単に使えるようにするため、PHPを実行したい場所(作業フォルダ内)に php.bat を作成して以下を記述する
@ECHO OFF C:\xampp\php\php.exe %*
これで単に
php -v
と入力するだけでPHPを実行できる。 ■Composerを導入
C:\xampp\php\php.exe composer.phar
でComposerを実行できるようにしたとする Composerをより簡単に使えるようにするため、Composerを実行したい場所(作業フォルダ内)に composer.bat を作成して以下を記述する
@ECHO OFF C:\xampp\php\php.exe "%~dp0composer.phar" %*
これで単に
composer
と入力するだけでComposerを実行できる。 ■PHP用Webドライバを入手 Composerで以下を実行し、Seleniumの実行に必要なライブラリをインストールする
composer require phpunit/phpunit composer require facebook/webdriver
■Chromeドライバを入手 以下からChromeDriverをダウンロードする。解凍して作成されるファイルを、composer.pharと同じ場所に配置する https://sites.google.com/chromium.org/driver/ ※今回は「ChromeDriver 87.0.4280.88」をダウンロードしたが、利用中のChromeのバージョンに合ったものをダウンロードする Chromeバージョンアップに伴い、後に「ChromeDriver 89.0.4389.23」「ChromeDriver 91.0.4472.101」と都度変更した ※マイナーバージョンは差があっても問題ないみたい。「91.0.4472.114」のときは「ChromeDriver 91.0.4472.101」で動作した ※Windowsの場合、chromedriver_win32.zip をダウンロードして解凍すると chromedriver.exe が作成されるので、これを使用する ■プログラムを作成(Yahoo検索を自動化) test.php
<?php require_once 'vendor/autoload.php'; use Facebook\WebDriver\Chrome\ChromeDriver; use Facebook\WebDriver\WebDriverBy; use Facebook\WebDriver\WebDriverExpectedCondition; // Chromeドライバを環境変数に設定 putenv('webdriver.chrome.driver=./chromedriver.exe'); // ブラウザを起動 $driver = ChromeDriver::start(); // 遷移 $driver->get('https://www.yahoo.co.jp/'); // テキストボックス入力 $driver->findElement(WebDriverBy::name('p'))->sendKeys('自動テスト'); // ボタン押下 $driver->findElement(WebDriverBy::className('_63Ie6douiF2dG_ihlFTen'))->click(); // タイトルが「検索結果」を含むものになるまで待つ $driver->wait()->until(WebDriverExpectedCondition::titleContains('検索結果')); // テキストを取得 $text = $driver->findElement(WebDriverBy::name('p'))->getAttribute('value'); // 結果を出力 echo 'TEXT:' . $text . "\n"; // ブラウザを閉じる $driver->close();
■プログラムを実行
php test.php
ブラウザが起動して処理され、完了すると以下のように結果が表示される
DevTools listening on ws://127.0.0.1:60771/devtools/browser/73b424e0-592c-4b07-ae4e-024847f68b22 TEXT:自動テスト
上記手順により「php」だけでPHPを起動できるはずだが、 起動できない場合はWindowsの環境変数の「Path」に以下を追加しておく C:\xampp\php もしくは以下のように、パス込みで実行する
C:\xampp\php\php.exe test.php
■エラー 以下のようなエラーが表示される場合、Chromeのバージョンアップに伴いドライバが利用できなくなっている バージョンに合ったドライバを、改めてダウンロードする
PHP Fatal error: Uncaught Facebook\WebDriver\Exception\SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 101 Current browser version is 105.0.5195.127 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
■その他メモ テスト実行時、以下のエラーが表示されることがあった
[5936:10116:0120/133404.194:ERROR:device_event_log_impl.cc(211)] [13:34:04.193] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F) [5936:10116:0120/133404.194:ERROR:device_event_log_impl.cc(211)] [13:34:04.194] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F)
以下のページを参照する限り無視して良さそうだが、また対策は考えたい Seleniumを使用しPythonでWebページのタイトルを取得する | 中小企業のIT相談窓口「Soo_Daaan」 - 論理的思考/課題解決/プログラミング https://laboratory.kazuuu.net/get-web-page-titles-in-python-using-selenium/
■PHP版Selenium環境をCentOS7に構築
■参考 PHPでChromeを操作(クロール)|743|note https://note.com/743/n/n7367632b1e19 CentOS7でPHP + facebook/php-webdriverでchromeを動かしてクローリング - Qiita https://qiita.com/tech31/items/11e7e7aee7d60df249fb ■Chromeのインストール
$ sudo su - # yum -y install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm # google-chrome --version Google Chrome 88.0.4324.96 # yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts … 日本語フォントをインストール # exit … rootでは実行できない $ google-chrome --headless --disable-gpu --dump-dom http://example.com/ <!DOCTYPE html> <html><head> <title>Example Domain</title> 〜中略〜 </body></html>
■Chromeドライバのインストール
$ sudo su - # wget https://chromedriver.storage.googleapis.com/88.0.4324.96/chromedriver_linux64.zip … バージョンはChromeに合わせる # unzip chromedriver_linux64.zip # sudo mv chromedriver /usr/local/bin/ # rm -f chromedriver_linux64.zip # exit $ chromedriver -v ChromeDriver 88.0.4324.96 (68dba2d8a0b149a1d3afac56fa74648032bcf46b-refs/branch-heads/4324@{#1784})
■プログラムを作成(Yahoo検索を自動化) Composerは導入済みとする
$ mkdir sample_php $ cd sample_php $ composer require phpunit/phpunit $ composer require facebook/webdriver
以下はテスト例 Windowsとは異なる指定を行っている箇所があるので注意
$ vi test.php
<?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; // Chromeドライバを環境変数に設定 putenv('webdriver.chrome.driver=/usr/local/bin/chromedriver'); // Linux用にパスを指定 // 非表示設定で起動 $option = new ChromeOptions(); $option->addArguments([ //'--no-sandbox', // rootの場合に必須 '--headless', '--disable-gpu', ('--window-size=800,600'), // 非表示でもスクリーンショットのサイズに反映 ]); $chrome = DesiredCapabilities::chrome(); $chrome->setCapability(ChromeOptions::CAPABILITY, $option); $driver = ChromeDriver::start($chrome); // 設定を反映してブラウザを起動 $driver = ChromeDriver::start($chrome); // 遷移 $driver->get('https://www.yahoo.co.jp/'); // 遷移されるまで待つ $driver->wait(10, 1000)->until(WebDriverExpectedCondition::urlContains('https://www.yahoo.co.jp/')); // テキストボックス入力 $driver->findElement(WebDriverBy::name('p'))->sendKeys('自動テスト'); // ボタン押下 $driver->findElement(WebDriverBy::className('_63Ie6douiF2dG_ihlFTen'))->click(); // タイトルが「検索結果」を含むものになるまで待つ $driver->wait()->until(WebDriverExpectedCondition::titleContains('検索結果')); // テキストを取得 $text = $driver->findElement(WebDriverBy::name('p'))->getAttribute('value'); // 結果を出力 echo 'TEXT:' . $text . "\n"; // スクリーンショットを撮影 $driver->takeScreenshot('yahoo.png'); // ブラウザを閉じる $driver->close();
■プログラムを実行
$ php test.php
■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
■JavaScript版Selenium環境をWindowsに構築
Seleniumで自動テスト - Qiita https://qiita.com/naka46/items/2587a5075d6920888648 上記のページを参考に、JavaScriptでテストを作成&実行する ■作業フォルダを作成 C:\Users\refirio\Selenium にSelenium用のフォルダを作成したとする ここに作業フォルダを作成するものとする
>C:\Users\refirio\Selenium >mkdir sample >cd sample
■必要なライブラリをインストール
>npm install -D selenium-webdriver >npm install -D mocha >npm install -D expect.js
■package.json を作成
>npm init -y
■ChromeDriverをインストール 以下からChromeDriverをダウンロードし、解凍して作成される chromedriver.exe を package.json と同じ場所に配置 (今回は「ChromeDriver 87.0.4280.88」をダウンロードしたが、利用中のChromeのバージョンに合ったものをダウンロードする) https://sites.google.com/a/chromium.org/chromedriver/downloads ■プログラムを作成 sample.js
var webdriver = require('selenium-webdriver'); var expect = require('expect.js'); var assert = require('assert'); var By = webdriver.By; describe('test sample', function(){ this.timeout(15000); let browser; // テスト開始前に行う処理 before(() => { browser = new webdriver.Builder().forBrowser('chrome').build(); }); // テスト終了時に行う処理 after(() => { browser.quit(); }); // テスト内容(itを複数記述できる) it('web app test1 success', async function() { // googleホームページを起動する。 await browser.get('https://google.co.jp'); //テスト処理 let targetValue = await browser.getTitle(); expect(targetValue).to.be('Google'); }); it('web app test2 error', async function() { // googleホームページを起動する。 await browser.get('https://google.co.jp'); //テスト処理 let targetValue = await browser.getTitle(); expect(targetValue).to.be('Google111'); }); });
■プログラムを実行
>npm test sample.js
ブラウザが起動して処理され、完了すると以下のように結果が表示される 今回は「1つのテストが成功して、1のテストが失敗する」という前提のテスト内容なので、「1 passing」「1 failing」のように表示されている
> sample@1.0.0 test C:\Users\refirio\Selenium\sample > mocha "sample.js" test sample DevTools listening on ws://127.0.0.1:65214/devtools/browser/b3ffd2b5-a747-41d5-b01b-cd8e019e1522 √ web app test1 success (3824ms) 1) web app test2 error 1 passing (5s) 1 failing 1) test sample web app test2 error: Error: expected 'Google' to equal 'Google111' at Assertion.assert (node_modules\expect.js\index.js:96:13) at Assertion.be.Assertion.equal (node_modules\expect.js\index.js:216:10) at Assertion.<computed> [as be] (node_modules\expect.js\index.js:69:24) at Context.<anonymous> (sample.js:37:32) at processTicksAndRejections (internal/process/task_queues.js:93:5) npm ERR! Test failed. See above for more details.
■その他メモ テスト実行時、以下のエラーが表示されることがあった
[15964:8524:1209/174355.103:ERROR:device_event_log_impl.cc(211)] [17:43:55.102] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F) [15964:8524:1209/174355.107:ERROR:device_event_log_impl.cc(211)] [17:43:55.107] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F)
以下のページを参照する限り無視して良さそうだが、また対策は考えたい Seleniumを使用しPythonでWebページのタイトルを取得する | 中小企業のIT相談窓口「Soo_Daaan」 - 論理的思考/課題解決/プログラミング https://laboratory.kazuuu.net/get-web-page-titles-in-python-using-selenium/
■Java版Selenium環境をWindowsに構築
■Eclipseインストール Pleiades - 日本語化プラグイン Eclipse, IntelliJ, PhpStorm... http://mergedoc.osdn.jp/ 「Eclipse 4.7 Oxygen」 のボタンから 「Windows 64bit」「Full Edition」「Java」 のEclipseをダウンロード 「pleiades-4.7.1-java-win-64bit-jre_20171019.zip」 を保存 展開して以下に移動 C:\Pleiades-4.7.1 初回は以下を起動 C:\Pleiades-4.7.1\eclipse\eclipse.exe -clean.cmd ワークスペースに「C:\Users\refirio\Selenium」を設定して起動(ソースコードを置く任意の場所) 次回は以下を起動。このファイルのショートカットを、デスクトップに作っておくといい C:\Pleiades-4.7.1\eclipse\eclipse.exe 以降は主に、以下のページを参照 [初心者向け] JavaでSeleniumを動かす - Qiita https://qiita.com/tsukakei/items/41bc7f3827407f8f37e8 ■Selenium入手 Downloads http://www.seleniumhq.org/download/ 本来は「Java 3.7.1」をダウンロードすればいいはずだが、今回は以前使った以下を使用する selenium-java-3.0.1 ■ChromeDriver入手 Downloads - ChromeDriver - WebDriver for Chrome https://sites.google.com/a/chromium.org/chromedriver/downloads 以前使ったドライバをインストール…と思ったが、使っているChromeが62なので、それにあったドライバを入手 ■Eclipse設定 メニューから「ファイル → 新規 → Javaプロジェクト」を実行 プロジェクト名に「selenium-sample」を入力して「完了」ボタンを押す プロジェクト内に「exe」フォルダを作成し、入手した chromedriver.exe を配置 プロジェクト内に「lib」フォルダを作成し、入手した client-combined-3.0.1-nodeps.jar を配置。selenium-java-3.0.1\lib の内容も同階層にすべて配置 プロジェクトを右クリック「ビルドパス → 外部アーカイブの追加」を選択し、 selenium-sample\lib 内のファイルをすべて追加 ■テスト実行 「src」フォルダを右クリックし、「新規 → クラス」を選択 パッケージに「jp.co.example.test」を入力し、名前に「SampleTest」を入力して完了を押す パッケージ名以外を以下に変更
import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class SampleTest { @Test public void testGoogleSearch() throws InterruptedException { // Optional, if not specified, WebDriver will search your path for chromedriver. System.setProperty("webdriver.chrome.driver", "C:/Users/refirio/Selenium/selenium-sample/exe/chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("http://www.google.com/xhtml"); Thread.sleep(5000); // Let the user actually see something! WebElement searchBox = driver.findElement(By.name("q")); searchBox.sendKeys("ChromeDriver"); searchBox.submit(); Thread.sleep(5000); // Let the user actually see something! driver.quit(); } }
SampleTest.java を右クリックし、「実行 → JUnitテスト」で実行できる Chromeが立ち上がり、Googleにアクセスして検索結果が表示されれば成功
■Ruby版Selenium環境をWindowsに構築
WebのUIテスト自動化 - Seleniumを使ってみる http://qiita.com/edo_m18/items/ba7d8a95818e9c0552d9 Selenium WebDriver + Ruby でWeb関係の自動化 http://ntkg.hatenablog.com/entry/2016/06/08/225241 Webブラウザの自動操作 (Selenium with Rubyの実例集) https://www.qoosky.io/techs/71dd2d67ea 全国のSeleniumer必読 http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856 RubyでSeleniumを使ってスクレイピング http://qiita.com/tomerun/items/9cb81d7a98150ff22f53 Selenium WebDriver + Ruby でWeb関係の自動化 http://ntkg.hatenablog.com/entry/2016/06/08/225241 まずはインストール
C:\Users\refirio>gem install selenium-webdriver ERROR: Could not find a valid gem 'selenium-webdriver' (>= 0), here is why: Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz) gem source --add https://rubygems.org/ gem source --remove http://rubygems.org/ gem source https://rubygems.org/ gem install "selenium-webdriver"
↑すべてダメだった selenium-webdriverをインストールできない
C:\Users\refirio>gem install "selenium-webdriver" --source http://rubygems.org" Fetching: rubyzip-1.2.0.gem (100%) Successfully installed rubyzip-1.2.0 Fetching: ffi-1.9.14-x64-mingw32.gem (100%) Successfully installed ffi-1.9.14-x64-mingw32 Fetching: childprocess-0.5.9.gem (100%) Successfully installed childprocess-0.5.9 Fetching: websocket-1.2.3.gem (100%) Successfully installed websocket-1.2.3 Fetching: selenium-webdriver-3.0.3.gem (100%) Successfully installed selenium-webdriver-3.0.3 Parsing documentation for childprocess-0.5.9 Installing ri documentation for childprocess-0.5.9 Parsing documentation for ffi-1.9.14-x64-mingw32 Installing ri documentation for ffi-1.9.14-x64-mingw32 Parsing documentation for rubyzip-1.2.0 Installing ri documentation for rubyzip-1.2.0 Parsing documentation for selenium-webdriver-3.0.3 Installing ri documentation for selenium-webdriver-3.0.3 Parsing documentation for websocket-1.2.3 Installing ri documentation for websocket-1.2.3 Done installing documentation for childprocess, ffi, rubyzip, selenium-webdriver, websocket after 7 seconds WARNING: Unable to pull data from 'https://rubygems.org/': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz) 5 gems installed
↑「--source http://rubygems.org"」を指定するとインストールできた
C:\localhost\home\ruby\public_html\selenium>irb irb(main):001:0> require "selenium-webdriver" => true irb(main):002:0> driver = Selenium::WebDriver.for :firefox Selenium::WebDriver::Error::WebDriverError: Unable to find Mozilla geckodriver. Please download the server from https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH. More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
↑一つずつコマンドを指定してみると、ドライバが必要だと言われた https://github.com/mozilla/geckodriver/releases から geckodriver-v0.11.1-win64.zip をダウンロード 展開して作成された geckodriver.exe を C:\selenium に配置し、PATH を登録
require "selenium-webdriver" # Firefox用のドライバを使う driver = Selenium::WebDriver.for :firefox # Googleにアクセス driver.navigate.to "http://google.com" # `q`というnameを持つ要素を取得 element = driver.find_element(:name, 'q') # `Hello WebDriver!`という文字を、上記で取得したinput要素に入力 element.send_keys "Hello WebDriver!" # submitを実行する(つまり検索する) element.submit # 表示されたページのタイトルをコンソールに出力 puts driver.title # 3秒待つ(サンプル) sleep 3 # テストを終了する(ブラウザを終了させる) driver.quit
コマンドラインから実行すると、Firefoxが立ち上がった
C:\localhost\home\ruby\public_html\selenium>ruby selenium.rb Google
テストサイトを開き、管理者ページにログインし、スクリーンショットを撮影するサンプル
require "selenium-webdriver" # Firefox用のドライバを使う driver = Selenium::WebDriver.for :firefox # テストサイトにアクセス driver.navigate.to "http://localhost/~test/levis-members/" # 「管理者用」リンクをクリック driver.find_element(:xpath, '//ul[1]/li[3]/a[1]').click # 1秒待つ sleep 1 # ログインフォームに、ユーザ名とパスワードを入力 element = driver.find_element(:name, 'username') element.send_keys "admin" element = driver.find_element(:name, 'password') element.send_keys "1234" # ログインする element.submit # 表示されたページのタイトルをコンソールに出力 puts driver.title # スクリーンショットを保存 driver.save_screenshot "ss/admin.png" # 3秒待つ sleep 3 # テストを終了する(ブラウザを終了させる) driver.quit
何故か要素を参照できない…という場合、「sleep 1」のように待ってから参照するといい nokogiriを扱う準備としてXPathを学ぶ http://d.hatena.ne.jp/riocampos+tech/20130824/p1
■Python版Selenium環境をWindowsに構築
Python で Selenium WebDriver を使ったブラウザテストをする方法 http://akiyoko.hatenablog.jp/entry/2014/04/29/231343 Selenium IDEをインストール Firefoxで https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ にアクセスしてインストール Selenium IDE を立ち上げた状態でブラウザを操作すると、コマンドが記録されていった そのままエクスポート
C:\localhost\home\python\public_html\selenium>python test.py
エクスポートされたファイルを実行してもエラーになった。Firefoxのバイナリを見つけられないらしい WebDriverException: Message: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line FirefoxBinary を読み込んで、Firefoxの実行ファイルを直接指定
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary ←追加 def setUp(self): binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe') ←追加 self.driver = webdriver.Firefox(firefox_binary=binary) ←修正
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from selenium.webdriver.firefox.firefox_binary import FirefoxBinary from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoAlertPresentException import unittest, time, re import os class Test(unittest.TestCase): def setUp(self): binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe') self.driver = webdriver.Firefox(firefox_binary=binary) self.driver.implicitly_wait(30) self.base_url = "http://www.yahoo.co.jp/" self.verificationErrors = [] self.accept_next_alert = True def test_(self): driver = self.driver driver.get(self.base_url) driver.find_element_by_id("srchtxt").clear() driver.find_element_by_id("srchtxt").send_keys(u"テスト") driver.find_element_by_id("srchbtn").click() driver.find_element_by_link_text(u"テスト - Wikipedia").click() driver.find_element_by_link_text(u"ソフトウェアテスト").click() time.sleep(3) FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ss\\screen.png") # Get Screen Shot driver.save_screenshot(FILENAME) def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException as e: return False return True def is_alert_present(self): try: self.driver.switch_to_alert() except NoAlertPresentException as e: return False return True def close_alert_and_get_its_text(self): try: alert = self.driver.switch_to_alert() alert_text = alert.text if self.accept_next_alert: alert.accept() else: alert.dismiss() return alert_text finally: self.accept_next_alert = True def tearDown(self): self.driver.quit() self.assertEqual([], self.verificationErrors) if __name__ == "__main__": unittest.main()
これで実行するとOKだった…が、最低限のものなら、もっとシンプルに書ける http://qiita.com/setsulla/items/918ea1872c1947bf108f
# -*- coding: utf-8 -*- import os, time from selenium import webdriver from selenium.webdriver.firefox.firefox_binary import FirefoxBinary FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ss/screen.png") binary = FirefoxBinary(r'C:\Program Files (x86)\Mozilla Firefox\firefox.exe') driver = webdriver.Firefox(firefox_binary=binary) driver.get("http://www.yahoo.co.jp/") driver.find_element_by_id("srchtxt").clear() driver.find_element_by_id("srchtxt").send_keys(u"テスト") driver.find_element_by_id("srchbtn").click() time.sleep(3) # Get Screen Shot driver.save_screenshot(FILENAME) # Close Web Browser driver.quit()

Advertisement