- Selenium
- PHP版Selenium環境をWindowsに構築
- PHP版Selenium環境をCentOS7に構築
- PHP版SeleniumでECCubeをテストする例
- JavaScript版Selenium環境をWindowsに構築
- Java版Selenium環境をWindowsに構築
- Ruby版Selenium環境をWindowsに構築
- Python版Selenium環境をWindowsに構築
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/
2024年10月時点では、以下のページから「chromedriver」の「win64」をダウンロードした(「chrome」ではなく「chromedriver」が必要)
https://googlechromelabs.github.io/chrome-for-testing/
※マイナーバージョンは差があっても問題ないみたい
「91.0.4472.114」のときは「ChromeDriver 91.0.4472.101」で動作した
■プログラムを作成(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()