seleniumを使ってPHPでChromeの自動操作をする

# seleniumを使ってPHPでChromeの自動操作をする

## テストとかどうでも良いから自動操作がしたい！
seleniumは本来phpUnitなどと組み合わせてテストを自動実行するために使われるのだが私はただブラウザの自動実行を体験したいだけ。
なので今回は『とりあえず自動操作を体感』したいという人に向けて発信する。  

## seleniumとは
これをご覧になるのが一番。コマンドを叩くだけで勝手にブラウザが起動して入力・検索を行っている。本記事ではここまでを目指す。
[![https://gyazo.com/ae5efc707b439fe0ccaf948809e0ae7e](https://i.gyazo.com/ae5efc707b439fe0ccaf948809e0ae7e.gif)](https://gyazo.com/ae5efc707b439fe0ccaf948809e0ae7e)

## 環境構築
今回はPHPで自動操作のプログラムを書き、Chromeで自動操作を実行する。  

公式ではphpでSeleniumを動かすドライバーがないため、Facebookの中の人が作ったSeleniumのPHP版、`facebook-webdriver`を使用する。（SNSのFacebookサービスとは無関係です）

### 作業ディレクトリの作成
とりあえず実行したいんじゃ、という方のためなので以後はこのフォルダ内で全ての作業を行っていく

```zsh:
~$ mkdir workspace
~$ cd workspace
```

### chromedriverのダウンロード

[ここ](http://chromedriver.chromium.org/downloads)からchromedriver_mac64.zipをダウンロードして解凍。

解凍したら`chromedriver`というファイルができるのでPATHが通っているフォルダに移動させて実行権限を付与。

```zsh:
mv ~/Downloads/chromedriver /usr/local/bin/
chmod +x /usr/local/bin/chromedriver
```

### selenium-server-standaloneのダウンロード
[selenium-server-standalone-3.4.0.jar](http://selenium-release.storage.googleapis.com/3.4/selenium-server-standalone-3.4.0.jar)
をダウンロードし、作業ディレクトリに移動。

```zsh:
mv ~/Downloads/selenium-server-standalone-3.4.0.jar ./
```

### composerのダウンロード
`composer`はPHPのライブラリ管理ツール。iOSでいう`cocoaPods`みたいなもの。  

```zsh:
curl -sS https://getcomposer.org/installer | php
```

### facebook-webdriverのインストール
以下のコマンドで一撃でインストールが完了する。  

```zsh:
php composer.phar require facebook/webdriver
```  
コマンドを叩いた後少し時間がかかるかもしれないが無事終わると下のようなレスポンスが返ってくる。

```zsh:
~/workspace$ php composer.phar require facebook/webdriver
Using version ^1.4 for facebook/webdriver
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing symfony/process (v3.3.4): Loading from cache
  - Installing facebook/webdriver (1.4.1): Loading from cache
Writing lock file
Generating autoload files
```
現在のフォルダはこのようになっているはず（lsコマンドで確認）。

```zsh:
~/workspace$ ls
composer.json  
composer.phar
vendor
composer.lock
selenium-server-standalone-3.4.0.jar
```

## 早速seleniumを動かしてみる
環境構築は以上で終了。早速seleniumを起動してみる。

```zsh:
java -jar selenium-server-standalone-3.4.0.jar &
```
コマンドの最後に＆をつけるとバックグラウンド起動になる。

自動操作プログラムはこちら。

```php:test.php
<?php

require_once './vendor/autoload.php';

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

/**
 * selenium facebook-webdriver 実行のサンプル
 */
function sample()
{
    // selenium
    $host = 'http://localhost:4444/wd/hub';
    // chrome ドライバーの起動
    $driver = RemoteWebDriver::create($host,DesiredCapabilities::chrome());
    // 指定URLへ遷移 (Google)
    $driver->get('https://www.google.co.jp/');
    // 検索Box
    $element = $driver->findElement(WebDriverBy::name('q'));
    // 検索Boxにキーワードを入力して
    $element->sendKeys('セレニウムで自動操作');
    // 検索実行
    $element->submit();

    // 検索結果画面のタイトルが 'セレニウムで自動操作 - Google 検索' になるまで10秒間待機する
    // 指定したタイトルにならずに10秒以上経ったら
    // 'Facebook\WebDriver\Exception\TimeOutException' がthrowされる
    $driver->wait(10)->until(
        WebDriverExpectedCondition::titleIs('セレニウムで自動操作 - Google 検索')
    );

    // セレニウムで自動操作 - Google 検索 というタイトルを取得できることを確認する
    if ($driver->getTitle() !== 'セレニウムで自動操作 - Google 検索') {
        throw new Exception('fail');
    }
    // キャプチャ
    $file = __DIR__ . '/' . __METHOD__ . "_chrome.png";
    $driver->takeScreenshot($file);

    // ブラウザを閉じる
    $driver->close();
}

// 実行
sample();

```

## いざ、実行！！
以下のコマンドで早速実行だ！
`php test.php`  
実行結果↓  
[![https://gyazo.com/ae5efc707b439fe0ccaf948809e0ae7e](https://i.gyazo.com/ae5efc707b439fe0ccaf948809e0ae7e.gif)](https://gyazo.com/ae5efc707b439fe0ccaf948809e0ae7e)

おお...!!素晴らしい、自動操作素晴らしい。  
成功すると作業ディレクトリ内に`sample_chrome.png`という名でスクリーンショットが取れているはず。（フル画面ではない）  
sample_chrome.png
![sample_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/142791/c2cb8ada-680a-5a2c-823d-330ec3fedb76.png)

## まとめ
今回はComposerもよくわからん、Seleniumもよくわからんという状態から自動操作をするまでを記したため、まどろっこしい部分等もあるかもしれないがそこらへんは各々飛ばしてくだせえ（Composerのインストールのくだりなど）。


## 大変参考にさせていただいたサイト
[Shimabox Blog](https://blog.shimabox.net/2017/04/30/try_php-webdriver_locally_on_mac/)  
基本的にはこちらのサイトを大いに参考にしています。本記事ではこちらのサイトを参考にしていて私が詰まったところ・わからなかったところを適宜追加してあります。

## おまけ
seleniumを起動するとき

```zsh:
java -jar selenium-server-standalone-3.4.0.jar &
```
のコマンドを叩いたが、バックグランドで起動したままになってしまうため、プロセスを終了させる必要がある。  
そんなときは以下のコマンドで終了させる。

```zsh:
ps aux | grep selenium-server-standalone | grep -v grep |awk {'print $2'} |xargs kill -9
```
ただ毎回これを打つのは馬鹿らしいのでalias（ショートカット）を登録しておく。
`.zshrc`または`.bashrc`の末尾に以下を追加。


```zsh:
#selenium起動のalias
alias selenium-up='java -jar selenium-server-standalone-3.4.0.jar &'
#selenium停止のalias
alias selenium-stop="ps aux | grep selenium-server-standalone | grep -v grep |awk {'print \$2'} |xargs kill -9"
```
`source ~/.zshrc`を実行後、以降は`selenium-up`で起動、`selenium-stop`で終了できる。