COMPANY SERVICE STAFF BLOG NEWS CONTACT

STAFF BLOG

スタッフブログ

TECHNICAL

テクログ

2024.06.14

PHPでChromeを操作してみた

テクログphp

はじめに

chrome-php というPHPのパッケージがあり、こちらを使用すると下記のようなことができます。

・Chromeからウェブサイトにアクセス
・ページのスクリーンショットやPDFを作成
・特定の箇所をクリックする等のマウスイベントの実行
・ボタンやリンクを押下することでウェブサイト内をクロール
・JavaScriptの実行 等

環境構築

ディレクトリ構成です。

/
├─ docker/
│ └─ Dockerfile
├─ docker-compose.yml
└─ index.php

Dockerfileとdocker-compose.ymlファイルを作成します。

使用可能なPHPのバージョンは7.4.15と8.0.2がありますが、8.0.2だとchrome-phpのパッケージ内でエラーが出るので注意です。

FROM php:7.4.15-cli

COPY --from=composer /usr/bin/composer /usr/bin/composer

RUN apt update && apt install -y curl zip unzip wget
RUN cd /tmp && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN cd /tmp && apt install -y --fix-missing ./google-chrome-stable_current_amd64.deb

RUN apt install -y task-japanese
RUN apt install -y fonts-ipafont
RUN fc-cache -fv
services:
  chrome-php:
    image: chrome-php
    container_name: chrome-php-container
    build: ./docker
    shm_size: '1gb'
    tty: true
    volumes:
      - ./:/app
      - /tmp/.X11-unix:/tmp/.X11-unix
    environment:
      - DISPLAY=$DISPLAY
      - XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
    working_dir: /app

下記コマンドを実行します。

# イメージのビルドとコンテナの作成
docker-compose up -d

# chrome-phpをインストール
docker-compose exec chrome-php composer require chrome-php/chrome

サンプルコード

index.phpを作成します。
使用するのは chrome-php のページにあるサンプルを一部修正したコードです。

<?php

require_once __DIR__ . '/vendor/autoload.php';

use HeadlessChromium\BrowserFactory;

$browserFactory = new BrowserFactory('google-chrome');

// starts headless Chrome
$browser = $browserFactory->createBrowser([
    'noSandbox' => true,
    'headless' => true, // falseに変更するとブラウザが表示される
    'customFlags' => [
        '--remote-allow-origins=*',
        '--disable-dev-shm-usage',
    ],
]);

try {
    // creates a new page and navigate to an URL
    $page = $browser->createPage();
    $page->navigate('http://example.com')->waitForNavigation();

    // get page title
    $pageTitle = $page->evaluate('document.title')->getReturnValue();

    // screenshot - Say "Cheese"! 😄
    $page->screenshot()->saveToFile('./foo/bar.png');

    // pdf
    $page->pdf(['printBackground' => false])->saveToFile('./foo/bar.pdf');
} finally {
    // bye
    $browser->close();
}

index.phpを実行します。

docker-compose exec chrome-php php index.php

下記、実行される処理の内容です。

・http://example.com にアクセス
・ウェブページのタイトルを取得
・ウェブページのスクリーンショットを撮影して、./foo/bar.png に保存
・ウェブページのPDFファイルを作成して、./foo/bar.pdf に保存

よく使う処理

■ ボタンを押下

$page->mouse()->find('#button')->click(); // "#button"はセレクタ

ボタンの押下でページを遷移する場合、直後に下記の処理を追加する必要があります。

$page->waitForReload();

■ JavaScriptを実行

evaluateメソッドの引数に、JavaScriptの処理を文字列として渡します。

$page->evaluate('document.querySelector("h1").textContent')->getReturnValue();

おわりに

作業効率化のスクリプトを作成したり、E2Eテストなどで活用できそうです。

この記事を書いた人

ノコ

入社年2021年

出身地岩手

業務内容Web開発

特技・趣味ゲーム、競プロ、数学

テクログに関する記事一覧

TOP