Help us understand the problem. What is going on with this article?

PHPでブラウザ自動化

More than 1 year has passed since last update.

※Windowsでの説明になります

前置

私がさくっとブラウザ自動化したいがためにまとめた記事です。
しっかり実装したい方向けではありませぬ。

簡単に説明

Selenium WebDriver

ブラウザを操作するのに必要。

ブラウザごとにドライバが用意されている。
(本記事ではChrome用のChromeDriver)

ドライバに対して、HTTPリクエストすると、ドライバはいい感じにブラウザを動かしてくれる

php-webdriver

WebDriverを動かすためのライブラリ。

WebDriverにHTTPリクエストするのも手間なので、
ライブラリにやってもらうのです。

でも、PHPは公式にないので、Facebookさんが作ってくれたようです。
今回はそれを使います。

Selenium Standalone Server

ドライバ、ライブラリ、ブラウザの相性が悪いときに使う。

php-webdriver + Chromeでは不要なはず・・。

関係図

【php-webdriver】⇒【Selenium WebDriver(ChromeDriver)】⇒【Chrome】

必要なもの

準備後の例

階層1 階層2
bin
L chromedriver.exe
php
L run.php
vender composerのファイル郡
run.bat
run.bat
@echo off

php php\run.php
php/run.php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverExpectedCondition;

define ('HOST', 'hoge');

run();

function run() {
    // Chromeドライバを環境変数にぶちこむ
    putenv('webdriver.chrome.driver=' . __DIR__ . '\..\bin\chromedriver.exe');

    // ブラウザ起動
    $driver = ChromeDriver::start();

    // 遷移
    $driver->get('https://' . HOST . '/login');

    // テキストボックス入力
    $driver->findElement(WebDriverBy::id('id'))
    ->sendKeys('email');

    $driver->findElement(WebDriverBy::id('password'))
    ->sendKeys('pass');

    // ボタン押下
    $driver->findElement(WebDriverBy::id('form_submit'))
    ->click();

    // タイトルがHelloを含むものになるまで待つ
    $driver->wait()->until(
        WebDriverExpectedCondition::titleContains('Hello')
    );
}

php-webdriverの使い方

主なものだけ抜粋。

詳しい説明はAPI仕様書見てね。
https://facebook.github.io/php-webdriver/latest/index.html

ブラウザ(WebDriver)起動

$driver = ChromeDriver::start();

※以下、ドライバオブジェクトは「$driver」とする

ChromeDriver

RemoteWebDriverを継承しているため、おもにそっちの関数。

URIで飛ぶ

$driver->get($uri);

エレメントを取得

$element = $driver->findElement(WebDriverBy);
例:id「id_txt」でエレメント取得
$driver->findElement(WebDriverBy::id('id_txt'));

※以下、RemoteWebElementは「$element」とする

WebDriverBy

エレメント探しに使う。

関数 使用目的
className(string $class_name) classで探す
id(string $id) idで探す
name(string $name) nameで探す
linkText(string $link_text) linkテキストを完全一致で探す
partialLinkText(string $partial_link_text) linkテキストを曖昧で探す
tagName(string $tag_name) タグで探す

クリック

$element->click();

入力

$element->sendKeys('入力値');

入力クリア

$element->clear();

SelectBoxの選択

$select = new WebDriverSelect($driver->findElement(WebDriverBy::id('slct_name_list')));

$select->selectByValue('たかし');

サブミット

エレメントがformのとき。

$element->submit();

待機

$driver->wait()->until(WebDriverExpectedCondition);
$driver->wait()->until(WebDriverExpectedCondition::titleContains('ログイン'));

WebDriverExpectedCondition

関数 使用目的
titleIs(string $title) titleが完全一致
titleContains(string $title) titleが曖昧一致
urlIs(string $url) URL完全一致
urlContains(string $url) URL曖昧一致
presenceOfElementLocated(WebDriverBy $by) 指定したエレメントがDOMに存在するか
visibilityOfElementLocated(WebDriverBy $by) 指定したエレメントが可視状態でDOMに存在するか
elementTextContains(WebDriverBy $by, string $text) 指定テキストが指定エレメントに完全一致で存在するか
elementTextIs(WebDriverBy $by, string $text) 指定テキストが指定エレメントに部分一致で存在するか
elementValueContains(WebDriverBy $by, string $text) 指定エレメントのvalueに指定値が存在するか
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした