Як я можу довести, що дві сторінки 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 для другого фрагмента коду, ймовірно, достатній для моїх потреб; якщо ви хочете запропонувати вдосконалення, вони будуть раді.)

EDIT : У моєму питанні порівнюються два невеликі зразки HTML, які можна відтворити так, щоб вони помістилися на видимій частині браузера. Але в цілому я хотів би знати відповідь на HTML, яка може бути досить довгою.


Підхід, який ви використовували, найкращий і для мене
Awais

4
Ви можете зробити скріншот обох, а потім накласти скріншоти та змінити непрозорість верхнього, щоб переконатися, що вони вишикуються
APAD1

2
@ APAD1 - Це все ще їх окуляри. Використовуйте зображення розл.
Квентін

1
В основному це дуп із закритого як занадто широкого порівняння двох джерел HTML та відображення візуальних відмінностей . Крім того, пошук в Інтернеті "візуальної різниці двох html-сторінок" відображає довгий список продуктів і бібліотек ...
Heretic Monkey

1
Я вважаю, що Smart Bear's TestComplete може зробити цю документацію , однак це може бути непосильним.
Грем

Відповіді:


8

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

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

Ось приклад для ілюстрації:

У наведеному вище коді у нас є 2 HTML-блоки та 2 полотна, де ми будемо малювати наші блоки. Як бачите, JS досить простий. Код в кінці виконує відповідність пікселів і показує, скільки різних пікселів мають обидва полотна. Я додав затримку, щоб переконатися, що обидва зображення завантажені (ви можете оптимізувати пізніше деякі події)

Ви також можете розглянути третє полотно, щоб виділити різницю між обома зображеннями та отримати візуальну різницю:

Давайте змінимо вміст, щоб побачити деяку різницю:

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

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


Оновлення

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

Давайте використаємо інше зображення:


5

Ось ідея насправді зробити деяке вимірювання з DOM - я щойно замінив розглянутий текст на діви, які мають клас, за яким можна запитати. Тоді ви можете надрукувати зміщення всіх вузлів.

З того, що я вимірюю, відступи символів справді такі ж, як і відступи символів &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>


"Я щойно замінив усі текстові вузли на діви" Ні, ви замінили лише ті частини, які ви бачили . Усі &nbsp;символи також є частиною TextNodes. Це важливо, оскільки це означає, що ваше рішення не може працювати програмно.
Каїдо

3

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

Детальну інформацію можна знайти за цим посиланням: https://selenium.dev/


Як ти порівнюєш пікселі? Чи є автоматизований спосіб це зробити? Крім того, що робити, якщо HTML був набагато довшим за приклад, який я наводив, і не вміщувався на екрані?
Purplejacket

2

Спочатку ми повинні захопити зображення

Спосіб захоплення 1

Використовуйте кнопку екрана друку на клавіатурі (або інший інструмент скріншоту).

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

Спосіб захоплення 2

Ви можете використовувати розширення для веб-переглядача, таке як пожежонебезпечне зображення, щоб захопити всю сторінку відразу.


По-друге, ми порівнюємо зображення

Спосіб 1

  1. Відкрийте фотошоп або перейдіть до фотопеї .

  2. Вставте скріншот у шар.

  3. Повторіть другу сторінку, вставивши її в інший шар.

  4. Увімкніть видимість шару та будь-які зміни будуть очевидними. Або регулюйте непрозорість верхнього шару (та / або встановіть різні режими накладання) для порівняння.

Спосіб 2

Використовуйте розширення для браузера, наприклад, pixel-perfect-2, яке дозволяє накладати напівпрозорі зображення у вашому браузері. Це корисне розширення і для перевірки вирівнювання та проміжків, оскільки ви можете накладати сторінки із сіткою зображення у вашому браузері.

Спосіб 3

Використовуйте інструмент для розрізнення зображень. Швидкий пошук у Google відобразиться тут занадто багато. Існують додатки для розрізнення зображень для деяких редакторів коду, інструменти командного рядка, сценарії Python та онлайн-сервіси, такі як дифчекер .


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

Накладіть дві сторінки один на одного за допомогою iframes. Це повинно дозволяти вам бачити будь-які відмінності між двома сторінками.

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>

(Я підозрюю, що є спосіб зробити це за допомогою Stack Snippets. Не соромтеся просвітити мене)


1

Тут є кілька дійсно складних і розумних методів коду, ось ось простий,

Зробіть знімок екрана, відкрийте його в редакторі зображень, який підтримує прозорість.

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


Що робити, якщо сторінка занадто довга для розміщення на екрані?
Purplejacket

Якщо у вас є фотошоп чи будь-який інший редактор, який його підтримує, встановіть різницю в режимі накладання на верхньому шарі. Якщо зображення однакові, ви побачите суцільне чорне зображення.
steveax

Так. HTML - це один рядок. Просто використовуйте cURL або інший метод, щоб надрукувати рядок, а потім порівняти його. Ось кілька інженерних прикладів бігу тут.
Ususipse

@Purplejacket, erm Скріншот додатка в цілому, Ctrl + Shift + Друк екрана,
Barkermn01

1

Як я вже бачив, мало хто згадує фактичні інструменти тестування.

Існує безліч інструментів для вашої справи (часто це частина великих рам):

Назвіть декілька взятих із цього списку. Можливо, погляньте на себе та оберіть відповідну вашому оточенню.

Якщо ви хочете створити стійку автоматизацію, не покладайтеся на хаки. Це може бути лише QA, але може серйозно зберегти ваш ** у майбутніх випусках.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.