PHPでブラウザ操作ができるFacebookの作ったライブラリ「facebook/php-webdriver」のカスタマイズ

数年前まではRubyやPython、Node.jsなどを使用するか、もしくはPHPのGoutteを使用する場合が多かったブラウザの自動操作ですが、

Facebookの作ったライブラリ「facebook/php-webdriver」を使用すると、PHPでも簡単にブラウザの自動操作が行えます。

そんな便利なライブラリですが、(執筆時では)

  • ヘッドレスモードではファイルダウンロードが行えない
  • ChromeDriver::start()ではタイムアウト値が固定されている

という問題点があるため、カスタマイズしてもっと便利にしてみました。

本記事はfacebook/php-webdriverのカスタマイズ内容のため、インストール方法や基本的な使用方法などは割愛しています。

注意事項

以下、早速の注意事項で申し訳ありません。

  • composerでインストールしたソースを直接改修するため、リスクがあります。
  • 本記事の内容は、2019年4月4日(木)にカスタマイズ及び動作確認を行った内容です。

使用するライブラリ、ブラウザ、ドライバー

繰り返しになりますが、使用するライブラリは以下です。
composerでインストールしてご使用ください。(動作確認したバージョンは1.6.0です)

GitHub – facebook/php-webdriver: A php client for webdriver.
https://github.com/facebook/php-webdriver

 

また、ブラウザはGoogle Chromeを使用します。
インストールされていない場合はインストールをお願いします。

 

Chromeブラウザを操作するために、以下からChromeドライバーをダウンロードして使用します。
(動作確認したものは、Linux x64のバージョン73.0.3683.68です)

Downloads – ChromeDriver – WebDriver for Chrome
http://chromedriver.chromium.org/downloads

ヘッドレスモードでダウンロードが行えない対策

ブラウザをGUIで起動して使用する分にはファイルのダウンロードは問題なく行えますが、
ヘッドレスモードで使用する場合はファイルのダウンロードが行えない問題があります。

Linuxなどのサーバー上で使用する場合はヘッドレスモードがほぼ必須になること、
またCSVファイル等のダウンロードが行えないため、ダウンロードできるようにカスタマイズします。

以下、カスタマイズ内容です。

カスタマイズ内容

vendor/facebook/webdriver/lib/Remote/DriverCommand.php

の差分情報。

差分(テキスト版)
差分(画像版)

vendor/facebook/webdriver/lib/Remote/HttpCommandExecutor.php

の差分情報。

差分(テキスト版)
差分(画像版)

カスタマイズ後の使用例

インポートするもの

 

ダウンロードディレクトリを設定する関数

 

ブラウザをヘッドレスモード+ダウンロードディレクトリを設定して起動

 

最後に

以上のカスタマイズにより、ブラウザ操作の中で以下のようなファイルダウンロードのリンクやボタンをクリックすると、指定したディレクトリにファイルがダウンロードされるようになりました。

 

なお、本カスタマイズ内容は以下のサイトを参考にさせて頂きました。(内容ほぼそのままです)
大変ありがとうございます。

【参考サイト】
PHPでChromeを操作(ダウンロードフォルダ指定)|743|note
https://note.mu/743/n/n2c1c07062f7f

ChromeDriver::start()では、タイムアウト設定ができない為タイムアウトが設定できるように対処

ChromeDriver::start()では、コネクションタイムアウト/リクエストタイムアウトのデフォルト値は30秒程しかないため、それ以上かかってしまった場合は処理が中断されてしまう問題があります。

RemoteWebDriver::create()ではタイムアウト値の設定が変更可能です。

普通に使用する場合は30秒もあれば十分ですが、例えばCSVファイルをダウンロード時に、サイト側でCSVファイルを生成してからダウンロードが開始されるため、リクエストタイムアウトの30秒を超えてしまう場合があります。

このような問題回避のため、タイムアウト値を自由に設定できるようカスタマイズを行います。

以下、カスタマイズ内容です。

カスタマイズ内容

vendor/facebook/webdriver/lib/Chrome/ChromeDriver.php

の差分情報。

差分(テキスト版)

・30行目

 

・39〜44行目

差分(画像版)

カスタマイズ後の使用例

 

最後に

以上のカスタマイズにより、ChromeDriver::start()でもタイムアウト値が自由に設定できるようになりました。

ファイルダウンロード処理を伴う場合は、恐らくタイムアウト値を大きくすることが必須になりそうです。

最後に

以上、facebook/php-webdriverのカスタマイズ方法でした。

composerでインストールしたソースに手を加えるためリスクが伴いますが、どうしてもPHPでブラウザ操作を行いたくて、ファイルダウンロードやタイムアウト値を変更したい場合は参考になれば幸いです。

composerでインストールしたソースに手を加えるため、Gitでのバージョン管理やデプロイ時、ライブラリのバージョンアップには注意が必要ですね。

facebook/php-webdriverでは、他にもUser Agentの設定やプロキシの設定、Chrome拡張機能(エクステンション)を読み込むこともできます。

特にChrome拡張機能は使い方次第では面白いことが出来そうです。

もしブラウザ自動操作をする上で、読み込ませたほうが良い便利な拡張機能があれば情報お待ちしてます。


【動確環境】

OS:Ubuntu 18.04.2 LTS
facebook/webdriver:1.6.0
google-chrome-stable:73.0.3683.103
ChromeDriver:73.0.3683.68(Linux x64)

コメントを残す

メールアドレスが公開されることはありません。

ABOUTこの記事をかいた人

高原 徹也

大手通信キャリアを経て、大ヒットスマートフォンアプリ開発を手がける企業で多数の開発プロジェクトに携わった後、起業。 起業後も様々な開発プロジェクトに携わり、開発を通じて会社を大きく成長させ、今ではASP会社、メディア運用会社を子会社で持ち、シンガポール法人でWEBメディア会社を経営、M&Aを手がける起業家として活動中。