backstopjsをWordPressサイトの画像遅延に対応させるスクリプト

WEBサイトの間違い探し、画像遅延どうする問題解決。BackstopJS。自動スクリーンショット→比較

backstopのonReady.jsのコード

私はengine_script/puppet/onReady.jsを使っていますが、backstop.jsonの"onReadyScript": "puppet/onReady.js",の部分を書き換えている人はそれに合わせてください。

module.exports = async (page, scenario, vp) => {
  console.log('SCENARIO > ' + scenario.label);
  await require('./clickAndHoverHelper')(page, scenario);


//追加コードここから

  // add more ready handlers here...
  const scrollStep = 100; // pxごとにスクロール
  const delay = 50;       // スクロール間の待ち時間(ms)

  // ページの高さを取得
  const bodyHeight = await page.evaluate(() => document.body.scrollHeight);
  const viewportHeight = vp.height;

  // 下までスクロール
  for (let y = 0; y < bodyHeight - viewportHeight; y += scrollStep) {
    await page.evaluate(_y => window.scrollTo(0, _y), y);
    await page.waitForTimeout(delay);
  }

  // 1秒待機
  await page.waitForTimeout(1000);

  // 上までスクロール
  for (let y = bodyHeight - viewportHeight; y > 0; y -= scrollStep) {
    await page.evaluate(_y => window.scrollTo(0, _y), y);
    await page.waitForTimeout(delay);
  }

  // 最上部に戻して念のため待機
  await page.evaluate(() => window.scrollTo(0, 0));
  await page.waitForTimeout(1000);


//追加コードここまで


};

動作内容はコード内にコメント入れている通りですが、一応解説。

  1. 少しずつ一番下までスクロール
  2. 1秒待つ
  3. 一番上までスクロールして戻る
  4. 1秒待つ

このあとスクリーンショットが保存されます。
時間短縮したい人は2や4を調整してください。

アップデート作業のあとにbackstopjsで表示確認

私は結構、WordPressサイトのメンテナンス(本体やプラグイン・テーマのアップデートやPHPバージョンアップ)をご依頼いただくことが多いのですが、ページ数が多いサイトは何よりチェック作業がたいへんです。
数が多いと集中力が持たずに見落としも増えるので、backstopjsのテストであがってきたdiffを目視で再チェックしています。

GitHub - garris/BackstopJS: Catch CSS curve balls. · GitHub

立ちはだかる画像の遅延読み込み問題!

立ちはだかるという表現は大げさに聞こえるかもしれませんが、実際に画像遅延の影響でdiffにあがってくる数が段違いに増えます。
画像の場所がぽっかり空くだけならまだいいのですが、ページのレイアウトによっては画像より下の要素すべてがずれてしまうので1pxのずれも見逃さないBackstopJSだと「ズレまくりじゃ~!」の結果になります。

画像の表示に関するcss変更の影響までチェックするためにも、backstopjs利用時の画像遅延対策は必要です。

実行に時間をかけるか、目視に時間をかけるか

遅延画像対策を入れると実行時間は大幅に伸びます。

そのぶん正確さが増すので目視での確認数が減り、結局は効率化できます。
実行中は別の作業ができることを考えれば大きな問題にはならないと感じます。

余談ですが、自動保存されるスクショはbackstop_data/bitmaps_referenceやbackstop_data/bitmaps_testに保存されます。
「おー、やってるやってる」とチラチラのぞくのも結構楽しいです。

backstop.jsonの準備もプラグインで自動化できる

業務で複数サイトをチェックしないといけない場合は、backstop.jsonを作るWordPressプラグインを作ってしまうと非常に効率UPします。

私の場合は下記要件で作りました。

  • 固定ページは全部取得
  • 投稿やカスタム投稿は最新10件ずつを取得
  • スクショ対象から外す要素やベーシック認証など、よく使う機能はチェックボックスで指定

自分用なのでデザイン性ゼロの画面ですが、こんな感じです。

backstopjs用のファイルを作成するプラグイン

backstopjsについてお世話になったサイト

インストールはこちらがわかりやすかったです。

デザイン崩れを恐れずコンポーネント修正をしよう!~BackstopJS編~ - KENTEM TechBlog

オプション機能はこちらがおススメ。

【Backstop JS】効果的に活用するための実践Tips

デフォルトでは表示されない、YoastSEOで使える変数

説明するまでもないほどメジャーなプラグイン、YoastSEO YoastSEO、超有名どころですね。一般的な情報は省略しますが、最新技術への対応も早いし多機能なわりに直感的に使えるメニュー構成が良き、です。 個人的には「 […]

カテゴリー
構築・設定
続きを読む

cPanel系サーバーでノーコードビルダーSitejet(サイトジェット)を使ってみた

Contents 対象レンタルサーバーなら追加料金不要。とりあえず試してみた。 cPanel版Sitejetが使えるレンタルサーバー cPanelのSitejetは本家Sitejetの機能制限版 Sitejet、使ってみ […]

カテゴリー
構築・設定
続きを読む