Как я могу доказать, что две 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>

И я хочу, чтобы второй выглядел точно так же, как первый.

Я считаю, что они выглядят одинаково, но мое единственное доказательство было в том, чтобы использовать старую технику «переключаться между окнами очень быстро и быстро». (Астрономы называют это «компаратором мерцания» - https://en.wikipedia.org/wiki/Blink_comparator ). Я удостоверился, что окна были того же самого размера и в том же самом положении. Но если визуализированный HTML не помещался на экране, это могло бы быть слишком сложно.

Есть ли более точный инструмент или метод для этого сравнения?

Я смотрел на них как в Chrome 77.0.3865.120, так и в Firefox 69.0.3.

Например, я знаю, что с помощью тестов Acid в браузере, которые изначально были частью проекта веб-стандартов - https://www.acidtests.org/ - идеальным показателем был пиксельный рендеринг.

(Дополнительные сведения: HTML-код для второго фрагмента кода, вероятно, соответствует моим потребностям; если вы хотите предложить улучшения, это будет приветствоваться.)

РЕДАКТИРОВАТЬ : Мой вопрос сравнивает два небольших образца HTML, которые могут быть отображены в видимой части браузера. Но в целом я хотел бы знать ответ для HTML, который может быть довольно длинным.


Подход вы используете лучше для меня , как хорошо
— Awais

4
Вы можете сделать снимок обоих снимков, а затем наложить снимки экрана и изменить непрозрачность верхнего
— слоя,

2
@ APAD1 - Это все еще радует их. Используйте изображение различий.
— Квентин

1
В основном, обманчиво закрытое слишком широкое Сравнение двух источников HTML и отображение визуальных различий . Кроме того, поиск в Интернете «визуального различия двух html-страниц» приводит к появлению длинного списка продуктов и библиотек ...
— Еретик Обезьяна

1
Я полагаю, что TestComplete от Smart Bear может сделать эту документацию , однако это может оказаться слишком дорогостоящим.
— Грэм

Ответы:


8

Я сделал нечто подобное при разработке веб-сайта, связанного с CSS . Мне пришлось сравнить вывод, созданный HTML / CSS, с изображением, которое ранее было сгенерировано с помощью HTML / CSS.

Я использовал dom-to-image , который преобразует код в изображение в кодировке base64. Я помещаю это изображение внутрь холста, а затем использую pixelmatch для сравнения обоих изображений.

Вот пример для иллюстрации:

В приведенном выше коде у нас есть 2 блока HTML и 2 полотна, где мы будем рисовать наши блоки. Как видите, JS довольно прост. Код в конце запускает сопоставление пикселей и показывает, сколько разных пикселей имеют оба полотна. Я добавил задержку, чтобы убедиться, что оба изображения загружены (вы можете оптимизировать позже с некоторыми событиями)

Вы также можете рассмотреть третий холст, чтобы подчеркнуть разницу между обоими изображениями и получить визуальную разницу:

Давайте изменим содержимое, чтобы увидеть разницу:

Вы можете прочитать больше о том, как работают два плагина, которые я использовал, и найти более интересные варианты.

Я устанавливаю размеры в 300x300, чтобы сделать демонстрацию внутри фрагмента легкой, но вы можете рассмотреть большую высоту и ширину.


Обновить

Вот более реалистичный пример для сравнения двух макетов, которые дают одинаковый результат. Ширина / высота холста будет динамичной и зависит от содержимого. Я покажу только последний холст с разницей.

Давайте использовать другое изображение:


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;символы также являются частью TextNodes. Это важно, потому что это означает, что ваше решение не может работать программно.
— Кайидо

3

Распечатайте экраны двух страниц и сравните пиксели.
Вы можете использовать веб-драйвер, такой как селен, визуализировать два экрана в файле изображения (png, jpg и т. Д.) - для этого у селена есть метод - и написать программное обеспечение для считывания пикселей обоих для сравнения на сходство.
Веб-драйвер - это браузер, которым вы можете управлять с помощью кода. И вы можете найти программное обеспечение, которое сравнивает изображения в Интернете.

Вы можете найти больше информации по этой ссылке: https://selenium.dev/


Как вы сравниваете пиксели? Есть ли автоматизированный способ сделать это? Кроме того, что если HTML-код был намного длиннее, чем приведенный мной пример, и не помещался на экране?
— Purplejacket

2

Сначала мы должны сделать снимки

Метод захвата 1

Используйте кнопку экрана печати на клавиатуре (или другой инструмент для создания снимков экрана).

Для страниц, которые должны быть длинными или широкими, чтобы уместиться на экране, сделайте несколько скриншотов каждой страницы и соедините их вместе в вашем фоторедакторе. Вы можете делать перекрывающиеся снимки экрана большой страницы, размещать их на отдельных слоях, а затем использовать перекрывающиеся части, чтобы точно расположить части перед объединением слоев, чтобы создать составную часть всей страницы.

Метод захвата 2

Вы можете использовать расширение браузера, такое как fireshot, чтобы захватить всю страницу сразу.


Во-вторых, мы сравниваем изображения

Способ 1

  1. Откройте фотошоп или зайдите в фотопеи .

  2. Вставьте скриншот в слой.

  3. Повторите для второй страницы, вставив в другой слой.

  4. Переключите видимость слоя, и любые изменения будут очевидны. Или отрегулируйте непрозрачность верхнего слоя (и / или установите различные режимы наложения) для сравнения.

Способ 2

Используйте расширение для браузера, например pixel-perfect-2 которое позволяет накладывать полупрозрачные изображения в вашем браузере. Это полезное расширение для проверки выравнивания и интервала, поскольку вы можете наложить страницы на сетку в вашем браузере.

Способ 3

Используйте инструмент сравнения изображений. Быстрый поиск в Google покажет слишком много, чтобы перечислить здесь. Для некоторых редакторов кода, инструментов командной строки, скриптов Python и онлайн-сервисов, таких как diffchecker, существуют плагины diff для изображений .


2

Вы можете поместить один над другим в том же документе с позиции: абсолютный; И, возможно, увеличить для более близкого взгляда.

#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 { ... }кажется, заставляют это работать должным образом.
— Purplejacket

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

Здесь есть несколько действительно сложных и умных методов кода, поэтому вот простой,

Сделайте скриншот одного из них, откройте его в графическом редакторе, поддерживающем прозрачность

Вставьте его, затем возьмите скрин-шоу с вашим CSS-способом и вставьте его, установите для второго вставленного изображения непрозрачность 50% и посмотрите, совпадают ли они.


Что если страница слишком длинная, чтобы уместиться на экране?
— Purplejacket

Если у вас есть фотошоп или любой другой редактор, который его поддерживает, установите режим наложения на верхнем слое на разницу. Если изображения идентичны, вы увидите сплошное черное изображение.
— Steveax

Да. HTML это одна строка. Просто используйте cURL или другой метод, чтобы напечатать строку, а затем сравните ее. Вот несколько более сложных примеров, бегущих здесь.
— Ususipse

@Purplejacket, erm Скриншот приложения в целом, Ctrl + Shift + Print Screen,
— Barkermn01

1

Как я уже видел, мало кто упоминает о реальных инструментах тестирования.

Существует множество инструментов для вашего сценария использования (часто это часть больших фреймворков):

Чтобы назвать несколько взятых из этого списка. Может быть, посмотрите на себя и выберите тот, который подходит вашей среде.

Если вы хотите создать устойчивую автоматизацию, не полагайтесь на хаки. Это может быть «только» QA, но может серьезно сохранить ваш ** в будущих версиях.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.