プログラムでブラウザを動かす環境を、30分で作る。 Windows編

## 概要
- Windows
- Selenium
- PHP
- facebook/php-webdriver
- Google Chrome
- ヘッドレス

---
## 前提条件

[Google Chromeの最新版](https://www.google.co.jp/chrome/)が動作していること

---
## 最初にダウンロードから
0. seleniumフォルダーを作ってそこに全部入れていくと吉
1. [Java9](http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html)
    * 376MBと大きいので時間がかかるぞ。
2. [selenium-server](http://selenium-release.storage.googleapis.com/3.4/selenium-server-standalone-3.4.0.jar)
    * seleniumフォルダーに直接ダウンロードするだけ。
3. [PHP for Windows](https://windows.php.net/download)   
    * Windowsが64bitならx64、32bitならx86。
    * Thread Safeがオススメ。
    * バージョンは一番上のものを選ぼう。

4. [Chrome Driver](https://sites.google.com/a/chromium.org/chromedriver/downloads)の最新版をダウンロード。
    * 解凍して、Windows版のドライバをseleniumフォルダーにコピーする。win32しかないので注意。

---
## 構築手順
1. ダウンロードした Java9 の .exe ファイルを実行する。
2. インストールが完了したら「コマンド プロンプト」を開いて、

```
> java --version
```

してみよう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/0f192550-4f36-d906-47c4-99842a47cd2a.png)
こんな感じになればOK。

3. ダウンロードしたPHP for Windowsを解凍する。
1. [composerのサイト](https://getcomposer.org/download/)にアクセスする。
2. Windows InstallerのComposer-Setup.exeのリンクをクリックする。
3. ダウンロードしたら開き、インストールする。
4. PHPの実行ファイルを探してきてくれる。便利。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/3cff5a8d-9c17-b3f9-0e76-899890cb875f.png)

---
## 構築手順2(PHPとSelenium Server)
1. 解凍したPHP for Windowsのディレクトリのphp.iniで、 **php_curl.dll** を有効化する(先頭のセミコロンを取り除く)

```
;extension=php_bz2.dll
extension=php_curl.dll
;extension=php_fileinfo.dll
```


2. composerでfacebook/php-webdriverをインストール

```
> cd c:\selenium
> composer require --dev facebook/webdriver
```

3. selenium-serverを起動する

(例)

```
> cd c:\selenium
> java -jar selenium-server-standalone-3.4.0.jar &   
```

---
## いざ実行！

1. [php-webdriverの本家サイト](https://github.com/facebook/php-webdriver/) で [サンプルプログラム](https://github.com/facebook/php-webdriver/blob/community/example.php) をコピーして、seleniumフォルダーに example.php として保存しよう。
2. [コマンド プロンプト]を起動して、実行してみよう。

```
> cd c:\selenium
> php -f example.php
```

Chromeが起動して、いくつかのサイトが表示された後に、Chromeのウィンドウが消えたでしょうか。なんか動いてる感じはするものの、すぐに消えてしまうので、スクリーンショットとして画像を残すプログラムを書き加えます。

```
// takeScreenshot
$screenshot = __DIR__ . "/php.png";
$driver->takeScreenshot($screenshot);
```

これで実行すると、Chromeが起動して消えた後に、seleniumフォルダーに「php.png」という画像が作られているはずなので、ダブルクリックして開いてみてください。
「php」でGoogle検索された画像が表示されたでしょうか？成功です！

---
## ヘッドレスモードを試してみる
* ヘッドレスは、ブラウザを起動しないモードです。
* 昨年夏から秋にかけて、ChromeやFireFoxにモードが実装されました。
* ブラウザを特に起動せずに、テストやスクリーンショット撮りをしたいときに便利です。

* nictというサイト（日本標準時を配信している）のスクリーンショットを、ブラウザを起動せずに取得します。

```php5

<?php

require_once './vendor/autoload.php';

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;

// nict site
$url = 'http://www.nict.go.jp/JST/JST.html';

// selenium server
$host = 'http://localhost:4444/wd/hub';

$options = new ChromeOptions();
$options->addArguments(array(
  '--headless',      // ヘッドレスモードを使用したい場合
));

$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);

// chrome ドライバーの起動
$driver = RemoteWebDriver::create($host, $caps);

// navigate to nict
$driver->get($url);

// takeScreenshot
$file = __DIR__ . '/nict.png';
$driver->takeScreenshot($file);

// close the browser
$driver->close();
```

実行してみると、特にブラウザが起動せずに、seleniumフォルダーに「nict.png」という画像ファイルが入っていると思います。
開いてみると、時刻入りの画像が表示されます。