月別アーカイブ: 2021年12月

PHP-WebDriverからFirefoxを操作 on FreeBSD

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)が作成される。