Laravelにはテスト用につくられたduskという機能があります
- 基本はPHPUnitのwrapperですが、E2Eに特化した機能が盛り込まれています。
- 裏で動くのはphpwebdriverです、つまりchromedriverとかseleniumサーバが必要なわけです。
- 手書きで申し訳ないですが、以下のような構成が一般的かと思います。(local部分は書かないほうがわかりやすかったかも)
dusk(一般的なWebDriverを使ったテスト)が動く順序
- 右上のdocker内php-fpmのコンテナ内でphp artisan duskでテストを動かします。
- テストコード内で指定したSeleniumサーバに接続します。
- 同じくテストコード内で指定したブラウザを使うように指示されたもの(Chrome, Firefoxなど)をSeleniumサーバ上で立ち上げます。
- この図では左上のdockerコンテナ内です。
- コードからの指示によりSeleniumサーバは立ち上がったブラウザを操作します。
- 表示された結果を精査(テスト)して、右上のphp-fpmコンテナ内でOK/NGの判断します。
難関その1: どのdockerイメージを使えば良いのか
- 昔はJava入れてSeleniumのjarとってきて、chromedriverとってきてVNCとか設定してもしくはxvfbインストールして・・・とかまあ大変でしたけど、今はおれたちのdockerがあるので数分で立ち上がります。(Thanks Docker!)
- Googleでselenium docker imageでググると早速GithubのURLが出てきました
- このままこれを使えば良いのかと思いきや、READMEを読み進めるとこういうことが書いてあります。
Experimental Mult-Arch aarch64/armhf/amd64 Images
For experimental docker container images, which run on platforms such as the Mac M1 or Raspberry Pi, see the community driven repository hosted at seleniumhq-community/docker-seleniarm. These images are built for three separate architectures: linux/arm64 (aarch64), linux/arm/v7 (armhf), and linux/amd64.
Furthermore, these experimental container images are published on Seleniarm Docker Hub registry.
- つまり、macのm1以降のひとはこのイメージじゃなくて、seleniarmをつかってねと。
- ですのでそちらを使うことにします
難関その2: 日本語ファイル名問題
- お客様ご要望で日本語ファイル名でダウンロードさせるという機能があるのですが、どうしてもダウンロードファイル名が download になってしまう。これはchromeの仕様でファイル名が正しく認識できないとfallback nameとして download になるそうです。
- テストでダウンロードしたファイル名が想定したものとなってるか調べたいときにこれでは大変困ります・・・。
考えられる原因と対処
- もともとのコードが悪いんじゃないか説
- content dispositionのファイル名がよろしくない
- RFCにじつは規定がちゃんとあって
- Content-Dispositionが filename*=utf8''urlエンコードされたファイル名 となっている必要がある
- その部分がRFC準拠してなかったので準拠してみたが、ダメ
- content dispositionのファイル名がよろしくない
- つかってるライブラリが影響してる説
- 別のライブラリに変更してみたがダメ
- んんーOSか・・・
結局のところロケールです
- ロケールって?
- ロケールを日本語にしてあげれば解決するんじゃないか
- 日本語がブラウザで表示できていたので、てっきりロケールも日本語になっていると思っていたがそうではない
seleniarmを日本語ロケールにする
- 環境変数だけではどうにもならなかったので、イメージビルドします
services:
(略)
selenium-server:
build: ./selenium
(略)
# あえてlatestにしていませんが、用途に合わせてlatestで良いかと思います
FROM seleniarm/standalone-chromium:114.0
USER root
# set timezeone
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN localedef -i /usr/share/i18n/locales/ja_JP -f UTF-8 /usr/lib/locale/ja_JP.UTF-8 && \
dpkg-reconfigure --frontend noninteractive locales
ENV LANGUAGE ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y chromium-l10n fonts-ipafont
これで日本語ファイル名をダウンロードしても日本語ファイル名としてダウンロードできます