Como posso provar que duas páginas HTML parecem idênticas?

19

Por exemplo, eu tenho isso:

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

e isto:

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

E quero que o segundo seja exatamente igual ao primeiro.

Acredito que eles pareçam idênticos, mas minha única prova foi usar a velha técnica de "alternar entre janelas rapidamente e ocular". (Os astrônomos chamam isso de "comparador intermitente" - https://en.wikipedia.org/wiki/Blink_comparator ). Eu verifiquei se as janelas tinham o mesmo tamanho e na mesma posição. Mas se o HTML renderizado não couber na tela, isso pode ter sido muito difícil.

Existe uma ferramenta ou método mais definitivo para fazer essa comparação?

Eu olhei para eles no Chrome 77.0.3865.120 e no Firefox 69.0.3.

Sei, por exemplo, que com o navegador os testes Acid que originalmente faziam parte do Web Standards Project - https://www.acidtests.org/ - a renderização perfeita de pixels foi a referência.

(Crédito extra: o HTML do segundo trecho de código provavelmente é adequado para minhas necessidades; se você sugerir melhorias, isso será bem-vindo.)

Edição : Minha pergunta compara dois pequenos exemplos de HTML, que podem ser renderizados para caber na parte visível do navegador. Mas, em geral, eu gostaria de saber a resposta para HTML que pode ser bastante longa.

Purplejacket
fonte
A abordagem que você estava usando é melhor para mim também
Awais
4
Você pode tirar uma captura de tela de ambos e, em seguida, sobrepor as capturas de tela e alterar a opacidade da primeira para garantir que
estejam
2
@ APAD1 - Isso ainda está de olho neles. Use uma imagem dif.
Quentin
11
Basicamente, um engano do fechado como muito amplo Compare duas fontes HTML e exiba diferenças visuais . Além disso, fazer uma pesquisa na Internet de "diferenças visuais de duas páginas html" exibe uma longa lista de produtos e bibliotecas ...
Heretic Macaco
11
Acredito que o TestComplete da Smart Bear pode fazer essa documentação , no entanto, pode ser um custo proibitivo.
Graham

Respostas:

8

Fiz algo semelhante ao desenvolver um webiste relacionado a CSS . Eu tive que comparar uma saída produzida por um HTML / CSS com uma imagem que foi gerada anteriormente com um HTML / CSS.

Usei dom-to-image , que converte código em uma imagem codificada em base64. Coloco essa imagem dentro de uma tela e, em seguida, uso pixelmatch para comparar as duas imagens.

Aqui está um exemplo para ilustrar:

No código acima, temos nossos 2 blocos HTML e 2 telas nas quais pintaremos nossos blocos. Como você pode ver, o JS é bastante simples. O código no final executa a correspondência de pixels e mostra quantos pixels diferentes as duas telas têm. Adicionei um atraso para garantir que as duas imagens sejam carregadas (você pode otimizar posteriormente com alguns eventos)

Você também pode considerar uma terceira tela para destacar a diferença entre as duas imagens e obter sua diferença visual:

Vamos mudar o conteúdo para ver alguma diferença:

Você pode ler mais sobre como os dois plug-ins que usei funcionam e encontrar opções mais interessantes.

Estou corrigindo os tamanhos para 300 x 300 para facilitar a demonstração dentro do snippet, mas você pode considerar uma altura e largura maiores.


Atualizar

Aqui está um exemplo mais realista para comparar entre dois layouts que produzem o mesmo resultado. A largura / altura da tela será dinâmica e baseada no conteúdo. Vou mostrar apenas a última tela com a diferença.

Vamos usar uma imagem diferente:

Temani Afif
fonte
5

Aqui está uma idéia para realmente fazer algumas medições com o DOM - acabei de substituir o texto em questão por divs que possuem uma classe que pode ser consultada. Em seguida, você pode imprimir o deslocamento de todos os nós.

Pelo que eu medi, os recuos dos caracteres são realmente os mesmos que os &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
fonte
"Acabei de substituir todos os nós de texto por divs" Não, você substituiu apenas as partes que estava vendo . Todos os &nbsp;caracteres também fazem parte dos TextNodes. Isso é importante, porque significa que sua solução não pode funcionar programaticamente.
Kaiido
3

Imprima as telas das duas páginas e compare os pixels.
Você pode usar um driver de web como o selênio, renderizar as duas telas em um arquivo de imagem (png, jpg, etc) - o selênio possui um método para fazer isso - e escrever um software para ler os pixels dos dois para comparar a similaridade.
O webdriver é um navegador que você pode controlar com código. E você pode encontrar um software que compara imagens na web.

Você pode encontrar mais informações neste link: https://selenium.dev/

Guilherme
fonte
Como você compara os pixels? Existe uma maneira automatizada de fazer isso? Além disso, e se o HTML tivesse sido muito mais longo que o exemplo que eu dei e não coubesse na tela?
Purplejacket 28/10/19
2

Primeiro temos que capturar imagens

Método de captura 1

Use o botão de tela de impressão no teclado (ou outra ferramenta de captura de tela).

Para páginas longas ou largas para caber na tela, tire várias capturas de tela de cada página e junte-as no seu editor de fotos. Você pode capturar capturas de tela sobrepostas de uma página grande, colocá-las em camadas separadas e usar as partes sobrepostas para posicionar as peças precisamente antes de mesclar camadas para criar um composto da página inteira.

Método de captura 2

Você pode usar uma extensão do navegador, como o fireshot, para capturar a página inteira de uma só vez.


Segundo, comparamos as imagens

Método 1

  1. Abra o photoshop ou vá para o photopea .

  2. Cole a captura de tela em uma camada.

  3. Repita o procedimento para a segunda página, colando em uma camada diferente.

  4. Alterne a visibilidade da camada e quaisquer alterações serão óbvias. Ou ajuste a opacidade da camada superior (e / ou defina diferentes modos de mesclagem) para comparar.

Método 2

Use uma extensão do navegador como pixel-perfect-2 que permite sobrepor imagens semitransparentes no seu navegador. Essa é uma extensão útil para verificar o alinhamento e o espaçamento também, porque você pode sobrepor páginas com uma imagem de grade no navegador.

Método 3

Use uma ferramenta de comparação de imagens. Uma rápida pesquisa no Google exibirá muitas para listar aqui. Existem plug-ins de diferenças de imagem para alguns editores de código, ferramentas de linha de comando, scripts Python e serviços online, como o diffchecker .

Veneseme Tyras
fonte
2

Você pode colocar um acima do outro no mesmo documento com a posição: absoluto; E talvez amplie para ver mais de perto.

#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
fonte
Isso é muito simpático! Eu tentei essa idéia, mas por causa de aspectos estranhos da <pre>tag em relação às <body>margens, não consegui que elas se alinhassem. Seus estilos #a, #b { ... }parecem fazê-lo funcionar corretamente.
Purplejacket
2

Sobreponha as duas páginas umas sobre as outras usando iframes. Isso deve permitir que você veja diferenças entre as duas 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>

(Suspeito que exista uma maneira de fazer isso usando os Snippets de pilha. Fique à vontade para me esclarecer)

ecc521
fonte
1

Existem alguns métodos de código realmente complexos e inteligentes aqui, então aqui é um método simples,

Tire uma captura de tela de uma, abra-a em um editor de imagens que ofereça suporte à transparência, como o photoshop,

Cole-o e, em seguida, mostre a tela do seu jeito CSS e cole-a em definir a segunda imagem colada com uma opacidade de 50% e veja se estão alinhadas.

Barkermn01
fonte
E se a página for muito longa para caber na tela?
precisa saber é o seguinte
Se você possui photoshop ou qualquer outro editor que o suporte, defina o modo de mesclagem na camada superior para diferenciar. Se as imagens forem idênticas, você verá uma imagem em preto sólido.
Steveax 22/11/19
Sim. HTML é uma string. Basta usar cURL ou outro método para imprimir a sequência e compará-la. Estes são alguns exemplos super-projetados que estão por aqui.
Ususipse
@Purplejacket, erm Captura de tela do aplicativo como um todo, Ctrl + Shift + Print Screen,
Barkermn01
1

Como já vi até agora, poucas pessoas mencionam ferramentas de teste reais.

Existem muitas ferramentas para o seu caso de uso (geralmente parte de estruturas maiores):

Para citar alguns extraídos desta lista. Talvez procure você mesmo e escolha um que se adapte ao seu ambiente.

Se você deseja criar uma automação sustentável, não confie em hacks. Pode ser "apenas" controle de qualidade, mas pode salvar seriamente seu a ** em versões futuras.

Nils K
fonte