2つのHTMLページが同一に見えることをどのように証明できますか?


19

たとえば、私はこれを持っています:

<pre>
sun<br/>
&nbsp;&nbsp;&nbsp;&nbsp;mercury <br/>
&nbsp;&nbsp;&nbsp;&nbsp;venus <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;earth <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mars <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jupiter <br/>
&nbsp;&nbsp;&nbsp;&nbsp;saturn <br/>
</pre>

この:

<div style="font-family:monospace">
  <div style="text-indent: 0">sun</div> <br/>
  <div style="text-indent: 4ch">mercury</div> <br/>
  <div style="text-indent: 4ch">venus</div> <br/>
  <div style="text-indent: 8ch">earth</div> <br/>
  <div style="text-indent: 8ch">mars</div> <br/>
  <div style="text-indent: 12ch">jupiter</div> <br/>
  <div style="text-indent: 4ch">saturn</div> <br/>
</div>

そして、私は2番目のものを最初のものとまったく同じように見せたいです。

私はそれらは同じに見えると思いますが、私の唯一の証拠は、古い「ウィンドウ間を実際にすばやく切り替える」という古いテクニックを使用することでした。(天文学者はこれを「瞬きコンパレータ」と呼びます-https://en.wikipedia.org/wiki/Blink_comparator)。窓のサイズと位置が同じであることを確認しました。しかし、レンダリングされたHTMLが画面に収まらない場合は、これが難しすぎる可能性があります。

この比較を行うためのより決定的なツールまたは方法はありますか?

私はこれらをChrome 77.0.3865.120とFirefox 69.0.3の両方で調べました。

たとえば、元々Web Standards Projectの一部であったブラウザのAcidテスト(https://www.acidtests.org/)では、ピクセルパーフェクトレンダリングがベンチマークであったことを知っています。

(追加のクレジット:2番目のコードスニペットのHTMLはおそらく私のニーズに適しています。改善を提案したい場合は、歓迎します。)

編集:私の質問は、ブラウザーの表示部分に収まるようにレンダリングできる2つの小さなHTMLサンプルを比較しています。しかし、一般的には、かなり長くなる可能性のあるHTMLの答えを知りたいです。


あなたが使っていたアプローチは私にとっても最も良いものです
Awais

4
両方のスクリーンショットを撮ってから、スクリーンショットをオーバーレイし、一番上のスクリーンショットの不透明度を変更して、それらが
揃う

2
@ APAD1 —まだ注目されています。画像の差分を使用します。
Quentin

1
基本的には、あまりにも広範にクローズされた2つのHTMLソースを比較して、視覚的な違いを表示します。また、「2つのhtmlページの視覚的差異」のインターネット検索を実行すると、製品とライブラリの長いリストが表示されます...
Heretic Monkey

1
Smart BearのTestCompleteでこのドキュメントを作成できると思いますが、コストがかかりすぎる可能性があります。
グラハム、

回答:


8

CSSに関連するwebisteを開発するときも、同様のことを行いました。HTML / CSSで生成された出力を、以前にHTML / CSSで生成された画像と比較する必要がありました。

コードをbase64でエンコードされたイメージに変換するdom-to-imageを使用しました。この画像をキャンバス内に配置してから、pixelmatchを使用して両方の画像を比較します。

以下に例を示します。

上記のコードには、2つのHTMLブロックと2つのキャンバスがあり、ブロックをペイントします。ご覧のとおり、JSは非常に単純です。最後のコードはピクセルマッチングを実行し、両方のキャンバスにある異なるピクセルの数を示します。両方の画像が確実に読み込まれるように遅延を追加しました(後でいくつかのイベントで最適化できます)

3番目のキャンバスを検討して、両方の画像の違いを強調し、視覚的な違いを取得することもできます。

内容を変更して、いくつかの違いを確認しましょう。

私が使用した2つのプラグインがどのように機能するかについての詳細と、より興味深いオプションを見つけることができます。

スニペット内のデモを簡単にするために、サイズを300x300に固定していますが、高さと幅を大きくすることもできます。


更新

同じ結果が得られる2つのレイアウトを比較するより現実的な例を次に示します。キャンバスの幅/高さは動的で、コンテンツに基づいています。違いのある最後のキャンバスのみを表示します。

別の画像を使用してみましょう:


5

これが実際にDOMで測定を行うアイデアです。問題のテキストを、照会可能なクラスを持つdivに置き換えました。次に、すべてのノードのオフセットを印刷できます。

私が測定したものから、文字のインデントは確かにと同じ&nbsp;です。

var nodes = document.getElementsByClassName('measure');

for (var n of nodes) {
  console.log(n.offsetLeft);
}
.measure {
  display: inline-block;
  background: red;
  width: 50px;
  height: 5px;
}
<pre>
<div class="measure"></div><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<div class="measure"></div><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<div class="measure"></div><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="measure"></div><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="measure"></div><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="measure"></div><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<div class="measure"></div><br/>
</pre>

var nodes = document.getElementsByClassName('measure');

for (var n of nodes) {
  console.log(n.offsetLeft);
}
.measure {
  display: inline-block;
  background: red;
  width: 50px;
  height: 5px;
}
<div style="font-family:monospace">
  <div style="text-indent: 0"><div class="measure"></div></div> <br/>
  <div style="text-indent: 4ch"><div class="measure"></div></div> <br/>
  <div style="text-indent: 4ch"><div class="measure"></div></div> <br/>
  <div style="text-indent: 8ch"><div class="measure"></div></div> <br/>
  <div style="text-indent: 8ch"><div class="measure"></div></div> <br/>
  <div style="text-indent: 12ch"><div class="measure"></div></div> <br/>
  <div style="text-indent: 4ch"><div class="measure"></div></div> <br/>
</div>


「私はdiv要素を持つすべてのテキストノードを置き換える」いいえ、あなただけの置き換え部品あなたがたを見に。すべての&nbsp;文字もTextNodeの一部です。これは、ソリューションがプログラムで機能できないことを意味するため、重要です。
海洋堂

3

2ページの画面を印刷し、ピクセルを比較します。
セレンなどのWebドライバーを使用して、2つの画面を画像ファイル(png、jpgなど)でレンダリングできます。セレンにはこれを行う方法があり、2つのピクセルを読み取って類似性を比較するソフトウェアを作成できます。
Webドライバーは、コードで制御できるブラウザーです。そして、あなたはウェブで画像を比較するソフトウェアを見つけることができます。

このリンクで詳細情報を見つけることができます:https : //selenium.dev/


ピクセルをどのように比較しますか?これを行う自動化された方法はありますか?また、HTMLが私が示した例よりもはるかに長く、画面に収まらなかった場合はどうなりますか?
Purplejacket

2

まず、画像をキャプチャする必要があります

キャプチャ方法1

キーボードのスクリーン印刷ボタン(または他のスクリーンショットツール)を使用します。

画面に収まるように長すぎたり広すぎたりするページの場合は、各ページのスクリーンショットを複数撮り、それらをフォトエディタでつなぎ合わせます。大きなページのスクリーンショットを重ねて撮影し、それらを別々のレイヤーに配置してから、レイヤーをマージしてページ全体の合成を作成する前に、重なり合った部分を使用してピースを正確に配置できます。

キャプチャ方法2

fireshotなどのブラウザ拡張機能を使用して、ページ全体を一度にキャプチャできます。


次に、画像を比較します

方法1

  1. photoshopを開くか、photopeaに移動します。

  2. スクリーンショットをレイヤーに貼り付けます。

  3. 別のレイヤーに貼り付けて、2ページ目に繰り返します。

  4. レイヤーの可視性を切り替えれば、どんな変更も明白になります。または、最上位レイヤーの不透明度を調整(および/または異なるブレンドモードを設定)して比較します。

方法2

pixel-perfect-2などのブラウザ拡張機能を使用すると、ブラウザ内で半透明の画像をオーバーレイできます。これは、ブラウザ内でグリッドイメージを使用してページをオーバーレイできるため、配置と間隔をチェックするのにも便利な拡張機能です。

方法3

画像差分ツールを使用します。簡単なグーグル検索は、ここにリストするには多すぎます。一部のコードエディター、コマンドラインツール、Pythonスクリプト、およびdiffcheckerなどのオンラインサービス用の画像差分プラグインがあります。


2

同じドキュメント内で、position:absolute;を上下に配置できます。ズームインして詳細を確認することもできます。

#a, #b {
  position:absolute;
  left:0;
  top:0;
  margin:0;
  padding:0;
  color:green;
  opacity:0.5;
}
#a {
  color:red;
}
#b {
  color:green;
}
<pre id="a">
sun<br/>
&nbsp;&nbsp;&nbsp;&nbsp;mercury <br/>
&nbsp;&nbsp;&nbsp;&nbsp;venus <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;earth <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mars <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jupiter <br/>
&nbsp;&nbsp;&nbsp;&nbsp;saturn <br/>
</pre>
    <div style="font-family:monospace" id="b">
      <div style="text-indent: 0">sun</div> <br/>
      <div style="text-indent: 4ch">mercury</div> <br/>
      <div style="text-indent: 4ch">venus</div> <br/>
      <div style="text-indent: 8ch">earth</div> <br/>
      <div style="text-indent: 8ch">mars</div> <br/>
      <div style="text-indent: 12ch">jupiter</div> <br/>
      <div style="text-indent: 4ch">saturn</div> <br/>
    </div>


いいね!私はこのアイデアを試しましたが<pre><body>マージンに関するタグの奇妙な側面のため、それらを揃えることができませんでした。あなたのスタイルは#a, #b { ... }それを適切に動作させるようです。
パープルジャケット

2

iframeを使用して、2つのページを重ね合わせます。これにより、2つのページの違いを確認できます。

main.html:

<iframe src="doc1.html"></iframe>
<iframe src="doc2.html" style="opacity:0.5"></iframe>
<style>

html, body {
    margin:0;
    height:100%;
}
iframe {
    height:100%;
    width:100%;
    position:absolute;
    top:0;
    left:0;
}

</style>

doc1.html:

<pre>
sun<br/>
&nbsp;&nbsp;&nbsp;&nbsp;mercury <br/>
&nbsp;&nbsp;&nbsp;&nbsp;venus <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;earth <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mars <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jupiter <br/>
&nbsp;&nbsp;&nbsp;&nbsp;saturn <br/>
</pre>

doc2.html

<div style="font-family:monospace">
  <div style="text-indent: 0">sun</div> <br/>
  <div style="text-indent: 4ch">mercury</div> <br/>
  <div style="text-indent: 4ch">venus</div> <br/>
  <div style="text-indent: 8ch">earth</div> <br/>
  <div style="text-indent: 8ch">mars</div> <br/>
  <div style="text-indent: 12ch">jupiter</div> <br/>
  <div style="text-indent: 4ch">saturn</div> <br/>
</div>

(スタックスニペットを使用してこれを行う方法があると思います。お気軽に教えてください)


1

ここには、本当に複雑で巧妙なコードメソッドがいくつかあります。

1つのスクリーンショットを撮り、photoshopなどの透明度をサポートする画像エディターで開きます。

貼り付けてから、CSSの方法で画面を見せて貼り付け、2番目に貼り付けた画像の不透明度を50%に設定して、それらが揃っているかどうかを確認します。


ページが長すぎて画面に収まらない場合はどうなりますか?
パープルジャケット

フォトショップ、またはそれをサポートするその他のエディターがある場合は、最上位レイヤーのブレンドモードを「差分」に設定します。画像が同一である場合、黒一色の画像が表示されます。
steveax

はい。HTMLは1つの文字列です。単にcURLまたは別のメソッドを使用して文字列を出力し、それを比較します。これらは、ここで実行されているいくつかの高度に設計された例です。
Ususipse

@ Purplejacket、ermアプリ全体のスクリーンショット、Ctrl + Shift + Print Screen
Barkermn01

1

これまで見てきたように、実際のテストツールについて言及している人はほとんどいません。

ユースケースには多くのツールがあります(多くの場合、より大きなフレームワークの一部です)。

このリストからいくつかを挙げます。多分あなた自身を探して、あなたの環境に合ったものを選んでください。

持続可能なオートメーションを構築したい場合は、ハックに頼らないでください。これはQAのみである可能性がありますが、将来のリリースでa **を大幅に節約できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.