作成日:2018-11-26, 更新日:2019-05-29
基本
「PHP、セレニウムを使ってみる」で作った「makeChrom()」でドライバを起動させる。
入力待ち状態にする(プログラムを終了させない)
たぶん、ムリ(※エラーを出せば待ち状態のままになる)
単純に確認したいだけなら、適当に「sleep()」とかいれてあげれば、すぐには終了されない。
formを実行
// URLを開く $driver->get($url); // formタグの「id=〇〇〇」で探す $wrapForm = $driver->findElement(WebDriverBy::id(〇〇〇)); // formタグの中にある「name=〇〇〇」を探して「□□□」を入力する $wrapForm->findElement(WebDriverBy::name(〇〇〇))->sendKeys(□□□); // formタグにある検索ボックスを送信:formなのでsubmit $wrapForm->submit(); // プログラムを終了させない:cmdは「ctrl+c」で終了させる $driver->wait()->until(WebDriverExpectedCondition::titleIs('aaaa'));
要素の取得(findElement(対象) / findElements(対象))
▼1個取得:findElement(対象)
$element = $driver->findElement(WebDriverBy::cssSelector('div.header')); // $element will be instance of RemoteWebElement $headerText = $element->getText();
▼複数取得:findElements(対象):「s」がついた複数形になる
$elements = $driver->findElements(WebDriverBy::cssSelector('ul.foo > li')); // $elements is now array - containing instances of RemoteWebElement (or empty, if no element is found) foreach ($elements as $element) { var_dump($element->getText()); }
対象(WebDriverBy::〇〇〇())
Css selector | CSSの指定(?)から探す | WebDriverBy::cssSelector('h1.foo > small') |
---|---|---|
Xpath | WebDriverBy::xpath('(//hr)[1]/following-sibling::div[2]') | |
Id | 「id="〇〇〇"」で直指定 | WebDriverBy::id('heading') |
Class name | 「class="〇〇〇"」で直指定 | WebDriverBy::className('warning') |
Name attribute (on inputs) | 「name="〇〇〇"」で直指定 | WebDriverBy::name('email') |
Tag name | タグ名 | WebDriverBy::tagName('h1') |
Link text | リンクテキスト(完全一致?) | WebDriverBy::linkText('Sign in here') |
Partial link text | リンクテキスト(部分一致?) | WebDriverBy::partialLinkText('Sign in') |
他、個人的によく使う
要素の親要素 | WebDriverBy::xpath('..') |
---|---|
要素の親の親要素 | WebDriverBy::xpath('../..') |
値の取得やクリックとか
Getting text of an element | テキスト取得 |
$txt = 〇〇->getText(); |
---|---|---|
Clicking an element (link, checkbox, etc.) | クリックする |
〇〇->click(); |
Typing into text field | formに値を入力 |
$input = 入力する値; 〇〇->sendKeys($input); |
How to clear the existing value in text field | formの値のクリア |
〇〇->clear(); |
How to check if an element is visible | 要素が可視かチェック |
$elm = 〇〇->findElement(〇〇); if ( $elm->isDisplayed() ) { // do something... } |
How to reload the page | ページのリロード |
$driver->navigate()->refresh(); |
Get attribute of an element | 属性の値取得 |
$attr = 取得したい属性名; $val = 〇〇->getAttribute($attr); |
Get value of an input element | value値(属性名が「value」) |
$attr = 'value'; $val = 〇〇->getAttribute($attr); |
Take a screenshot | ページのスクリーンショット |
$filename = __DIR__ . '/myfile.png'; $screenshot = $driver->takeScreenshot(); file_put_contents($filename, $screenshot); |
他、個人的によく使う
要素のHTMLを取得(innerHTML、outerHTML) |
$html = 〇〇->getAttribute('innerHTML'); |
---|---|
ページ遷移(戻る、更新とか) |
$url = 'http://〇〇〇〇〇'; $driver->navigate()->to($url); ▼進む・戻る・更新 $driver->navigate()->forward(); // 進む $driver->navigate()->back(); // 戻る $driver->navigate()->refresh(); // 更新 |
基本型のサンプル
下記の「testLogin($url)」のトコを自サイトにあわせてゴニョゴニョ修正する必要あり。
<?php use Facebook\WebDriver\Chrome\ChromeDriver; use Facebook\WebDriver\WebDriverBy; use Facebook\WebDriver\WebDriverExpectedCondition; require_once __DIR__ . '/vendor/autoload.php'; function makeChrom() { putenv('webdriver.chrome.driver=' . __DIR__ . '\bin\chromedriver.exe'); return ChromeDriver::start(); } function openChrom($url) { // Chromeを起動 $driver = makeChrom(); // URLを開く $driver->get($url); // adding cookie $driver->manage()->deleteAllCookies(); $cookie = new Cookie('cookie_name', 'cookie_value'); $driver->manage()->addCookie($cookie); return $driver; } // =========================================================== function testLogin($url) { // URLをChromeで開く $driver = openChrom($url); // フォームを取得(「id="〇〇〇〇"」を取得) $elmForm = $driver->findElement(WebDriverBy::id(〇〇〇〇)); // ログインIDをセット(「name="email"」にセット) $elmForm->findElement(WebDriverBy::name('email'))->sendKeys(〇〇〇〇); // ログインPWをセット(「name="pwd"」にセット) $elmForm->findElement(WebDriverBy::name('pwd'))->sendKeys(〇〇〇〇); // form送信 //$elmForm->submit(); // 送信ボタンクリックでJSを走らせてゴニョゴニョさせているなら、コレは使えない。 $elmForm->findElement(WebDriverBy::id('btnLogin'))->click(); // (「id="btnLogin"」をクリック) // 例外処理が走って落ちるので・・・sleep()にする //$driver->wait()->until( // WebDriverExpectedCondition::titleContains('About') //); //$aryElms = $driver->findElements(WebDriverBy::tagName('h2')); //foreach ( $aryElms as $rowElm ) { // echo $rowElm->getText() . "\n"; //} // ▼sleep()よりは「do-while()」で毎秒チェックさせるのがよさげ sleep(5); // 現在のURLが「https://〇〇〇〇/」だったら「h2」タグのテキストを全部出力 if ( $driver->getCurrentURL() == 'https://〇〇〇〇/' ) { // findElements:まとめて取得(複数形になる) $aryElms = $driver->findElements(WebDriverBy::tagName('h2')); foreach ( $aryElms as $rowElm ) { echo $rowElm->getText() . "\n"; } } else { echo 'err' . "\n"; } // 上記のsleepよりは下記のほうが良さげ // $cnt = 0; // do { // if ( タイトルが等しいかチェックなどの諸条件 ) { // break; // } // // sleep(1); // $cnt++; // } // while( 10 < $cnt ); // 最大回数 //調べていたら「close()」と「quit()」の表記があった。どっちが正解なのかは不明だけど、どっちもエラーにはならない //$driver->close(); $driver->quit(); } // ログインフォームのテスト $url = 'https://〇〇〇〇〇〇'; testLogin($url);
関連項目
公式
・facebook/php-webdriver - PHPで使うメソッドたちの説明とか