¿Cómo puedo demostrar que dos páginas HTML se ven idénticas?

19

Por ejemplo, tengo esto:

<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>

y esto:

<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>

Y quiero que el segundo se vea exactamente igual al primero.

Creo que se ven idénticos, pero mi única prueba fue usar la vieja técnica de "alternar entre ventanas muy rápido y mirarlo". (Los astrónomos llaman a esto un "comparador de parpadeo" - https://en.wikipedia.org/wiki/Blink_comparator ). Me aseguré de que las ventanas fueran del mismo tamaño y en la misma posición. Pero si el HTML renderizado no cabía en la pantalla, esto podría haber sido demasiado difícil.

¿Existe alguna herramienta o método más definitivo para hacer esta comparación?

Los miré en Chrome 77.0.3865.120 y Firefox 69.0.3.

Sé, por ejemplo, que con el navegador, las pruebas de ácido que originalmente formaban parte del Proyecto de estándares web - https://www.acidtests.org/ - la representación perfecta de píxeles fue el punto de referencia.

(Crédito adicional: el HTML para el segundo fragmento de código probablemente sea adecuado para mis necesidades; si desea sugerir mejoras, sería bienvenido).

EDITAR : Mi pregunta compara dos pequeñas muestras HTML, que se pueden procesar para que quepan en la parte visible del navegador. Pero en general me gustaría saber la respuesta para HTML que podría ser bastante larga.

Chaqueta morada
fuente
El enfoque que estabas usando también es el mejor para mí
Awais
44
Puede tomar una captura de pantalla de ambos y luego superponer las capturas de pantalla y cambiar la opacidad de la superior para asegurarse de que se
alineen
2
@ APAD1 - Eso todavía los mira a los ojos. Use una imagen diff.
Quentin
1
Básicamente un engaño de lo cerrado como demasiado amplio Compare dos fuentes HTML y muestre diferencias visuales . Además, hacer una búsqueda en Internet de "visual diff de dos páginas html" muestra una larga lista de productos y bibliotecas ...
Heretic Monkey
1
Creo que TestComplete de Smart Bear puede hacer esta documentación , sin embargo, puede tener un costo prohibitivo.
Graham

Respuestas:

8

He hecho algo similar al desarrollar un sitio web relacionado con CSS . Tuve que comparar una salida producida por un HTML / CSS con una imagen que se generó previamente con un HTML / CSS.

Solía dom-a-imagen , que convierte el código a una imagen con codificación base64. Coloco esta imagen dentro de un lienzo y luego uso pixelmatch para comparar entre ambas imágenes.

Aquí hay un ejemplo para ilustrar:

En el código anterior, tenemos nuestros 2 bloques HTML y 2 lienzos donde pintaremos nuestros bloques. Como puede ver, el JS es bastante simple. El código al final ejecuta la coincidencia de píxeles y muestra cuántos píxeles diferentes tienen ambos lienzos. Agregué un retraso para asegurarme de que ambas imágenes estén cargadas (puede optimizar más adelante con algunos eventos)

También puede considerar un tercer lienzo para resaltar la diferencia entre ambas imágenes y obtener su diferencia visual:

Cambiemos el contenido para ver alguna diferencia:

Puede leer más sobre cómo funcionan los dos complementos que utilicé y encontrar opciones más interesantes.

Estoy arreglando los tamaños a 300x300 para facilitar la demostración dentro del fragmento, pero puede considerar una mayor altura y ancho.


Actualizar

Aquí hay un ejemplo más realista para comparar entre dos diseños que producen el mismo resultado. El ancho / alto del lienzo será dinámico y se basará en el contenido. Solo mostraré el último lienzo con la diferencia.

Usemos una imagen diferente:

Temani Afif
fuente
5

Aquí hay una idea para medir realmente con el DOM: acabo de reemplazar el texto en cuestión con divs que tienen una clase que se puede consultar. Luego puede imprimir el desplazamiento de todos los nodos.

Por lo mido los guiones de los personajes son de hecho el mismo que el &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>

MrRobboto
fuente
"Acabo de reemplazar todos los nodos de texto con divs" No, reemplazaste solo las partes que estabas viendo . Todos los &nbsp;caracteres también son parte de los TextNodes. Esto es importante porque significa que su solución no puede funcionar mediante programación.
Kaiido
3

Imprima las pantallas de las dos páginas y compare los píxeles.
Puede usar un controlador web como selenio, renderizar las dos pantallas en un archivo de imagen (png, jpg, etc.), selenio tiene un método para hacerlo, y escribir un software para leer los píxeles de los dos para comparar por similitud.
El controlador web es un navegador que puede controlar con código. Y puede encontrar software que compara imágenes en la web.

Puede encontrar más información en este enlace: https://selenium.dev/

Guilherme
fuente
¿Cómo se comparan los píxeles? ¿Hay una manera automatizada de hacer esto? Además, ¿qué pasaría si el HTML hubiera sido mucho más largo que el ejemplo que di, y no encajara en la pantalla?
Purplejacket
2

Primero tenemos que capturar imágenes

Método de captura 1

Use el botón de imprimir pantalla en su teclado (u otra herramienta de captura de pantalla).

Para páginas que sean demasiado largas o anchas para que quepan en la pantalla, tome varias capturas de pantalla de cada página y únalas en su editor de fotos. Puede tomar capturas de pantalla superpuestas de una página grande, colocarlas en capas separadas, luego usar las porciones superpuestas para colocar las piezas con precisión antes de fusionar capas para crear un compuesto de toda la página.

Método de captura 2

Puede usar una extensión del navegador como disparo de fuego para capturar toda la página a la vez.


Segundo comparamos las imágenes

Método 1

  1. Abre Photoshop o ve a Photopea .

  2. Pega la captura de pantalla en una capa.

  3. Repita para la segunda página, pegando en una capa diferente.

  4. Alternar la visibilidad de la capa y cualquier cambio será obvio. O ajuste la opacidad de la capa superior (y / o configure diferentes modos de fusión) para comparar.

Método 2

Utilice una extensión del navegador como pixel-perfect-2 que permite superponer imágenes semitransparentes dentro de su navegador. Esta es una extensión útil para verificar la alineación y el espaciado también, porque puede superponer páginas con una imagen de cuadrícula dentro de su navegador.

Método 3

Use una herramienta de diferencia de imagen. Una búsqueda rápida en Google mostrará demasiados para enumerarlos aquí. Hay complementos de diferencias de imagen para algunos editores de código, herramientas de línea de comandos, scripts de Python y servicios en línea como diffchecker .

Veneseme Tyras
fuente
2

Puede colocar uno encima de otro en el mismo documento con position: absolute; Y tal vez acercar para ver más de cerca.

#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>

V.Volkov
fuente
Eso es muy lindo! Intenté esta idea, pero debido a aspectos extraños de la <pre>etiqueta con respecto a los <body>márgenes, no pude lograr que se alinearan. Sus estilos #a, #b { ... }parecen hacer que funcione correctamente.
Purplejacket
2

Superponga las dos páginas una encima de la otra usando iframes. Esto debería permitirle ver las diferencias entre las dos páginas.

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>

(Sospecho que hay una manera de hacer esto usando fragmentos de pila. Siéntase libre de iluminarme)

ecc521
fuente
1

Hay algunos métodos de código realmente complejos e inteligentes aquí, así que aquí hay uno simple,

Tome una captura de pantalla de uno, ábralo en un editor de imágenes que admita transparencia. Al igual que Photoshop,

Pásalo, luego muestra la pantalla de tu forma CSS y pégalo para establecer la segunda imagen pegada en una opacidad del 50%, y ver si se alinean.

Barkermn01
fuente
¿Qué pasa si la página es demasiado larga para caber en la pantalla?
Purplejacket
Si tiene Photoshop, o cualquier otro editor que lo admita, establezca el modo de fusión en la capa superior para diferenciarlo. Si las imágenes son idénticas, verá una imagen negra sólida.
Steveax
Si. HTML es una cadena. Simplemente use cURL u otro método para imprimir la cadena y luego compárela. Estos son algunos ejemplos sobre ingeniería que corren por aquí.
Ususipse el
@Purplejacket, erm Captura de pantalla de la aplicación en su conjunto, Ctrl + Shift + Imprimir pantalla,
Barkermn01
1

Como he visto hasta ahora, pocas personas mencionan herramientas de prueba reales.

Hay muchas herramientas para su caso de uso (a menudo parte de marcos más grandes):

Por nombrar algunos tomados de esta lista. Quizás busque usted mismo y elija uno que se adapte a su entorno.

Si quieres construir una automatización sostenible, no confíes en los hacks. Es posible que 'solo' sea control de calidad, pero puede guardar seriamente su a ** en futuras versiones.

Nils K
fuente