FreeBSD環境において、PHP-WebDriverからFirefoxを操作してヘッドレスFirefoxを試してみる。とりあえず、Googleのスクリーンショットを撮影するところまでやってみた。
環境
- FreeBSD 12.3-STABLE r371191
- 専用のJailゲストを作成して実行した。(jail内でも動く)
- Firefox 95.0 / PHP 8.0.13 (本記事作成時点のFreeBSDパッケージで導入可能な最新版)
PHP-WebDriverとFirefoxの組み合わせで動かした訳
- そもそもPHPぐらいしか普段使わないのでPHPで書きたかった。
- 操作するブラウザをChromeにしなかったのは、WebDriverからChromeの操作に必要なchromedriverのパッケージがFreeBSDになく、Firefoxの操作に必要なgeckodriverはパッケージがあったので
- 情報自体はChrome(chromedriver)向けの方が見かける気がする。もっというとコードもPHPじゃなくてPython等のサンプルの方が多いけど、そのへんは気合でなんとかする(Pythonで書いてあるのをPHP風に書いてみたら意外と動いたりする)
必要パッケージのインストール(root)
Firefox、geckodriver、日本語フォント、PHPを導入する。
# pkg install firefox geckodriver ja-font-migmix php80 php80-curl php80-mbstring php80-zip php80-phar php80-filter
作業ディレクトリを作成してphp-webdriver導入
% mkdir ~/webdriver % cd ~/webdriver % curl -sS https://getcomposer.org/installer | php % php composer.phar require php-webdriver/webdriver
テストプログラム作成 (~/webdriver/test.php)
<?php
require_once('./vendor/autoload.php');
use Facebook\WebDriver\Firefox\FirefoxDriver;
use Facebook\WebDriver\Firefox\FirefoxOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverDimension;
use Facebook\WebDriver\WebDriverExpectedCondition;
run();
function run() {
putenv('webdriver.gecko.driver=/usr/local/bin/geckodriver');
$desiredCapabilities = DesiredCapabilities::firefox();
$firefoxOptions = new FirefoxOptions();
$firefoxOptions->addArguments(['--headless',
'--width=1920',
'--height=1080',
]);
$desiredCapabilities->setCapability(FirefoxOptions::CAPABILITY, $firefoxOptions);
$driver = FirefoxDriver::start($desiredCapabilities);
$driver->get('https://www.google.com/');
sleep(3);
$driver->takeScreenshot(__DIR__ . '/ss.png');
$driver->close();
}
この例だと $firefoxOptions のところでヘッドレスモード(–headless)、ウィンドウサイズ(–widthと–height)を指定している。
ページの取得($driver->get)からスクリーンショット撮影($driver->takeScreenshot)までの間sleepしてるのはページのロード待ちなんだけど本当はWebDriver側のwaitを使うべきで筋としては良くないです(テストなので勘弁を)
テストプログラム実行
実行すると同じディレクトリにスクリーンショット(ss.png)が作成される。