İki HTML sayfasının aynı göründüğünü nasıl kanıtlayabilirim?


19

Örneğin, bende:

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

ve bu:

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

Ve ikincisinin aynen ilkine benzemesini istiyorum.

Bu özdeş görünmek inanıyorum, ama benim tek kanıt eski "windows hızlı ve göz küresi arasında ileri geri geçiş" tekniği kullanmak oldu. (Gökbilimciler buna "göz kırpma karşılaştırıcısı" derler - https://en.wikipedia.org/wiki/Blink_comparator ). Pencerelerin aynı boyutta ve aynı konumda olduğundan emin oldum. Ancak, oluşturulan HTML ekrana sığmazsa, bu çok zor olabilir.

Bu karşılaştırmayı yapmak için daha kesin bir araç veya yöntem var mı?

Bunlara hem Chrome 77.0.3865.120 hem de Firefox 69.0.3'te baktım.

Örneğin, başlangıçta Web Standartları Projesi'nin bir parçası olan tarayıcı Asit testleri - https://www.acidtests.org/ - piksel mükemmel renderin kriter olduğunu biliyorum .

(Ekstra Kredi: İkinci kod snippet'inin HTML'si muhtemelen ihtiyaçlarım için yeterli; iyileştirmeler önermek istersen bunlar hoş karşılanır.)

DÜZENLE : Sorum, tarayıcının görünür kısmına sığacak şekilde oluşturulabilen iki küçük HTML örneğini karşılaştırıyor. Ancak genel olarak HTML için oldukça uzun olabilecek cevabı bilmek istiyorum.


Kullandığınız yaklaşım benim için de en iyisi
Awais

4
Her ikisinin de ekran görüntüsünü alabilir ve ardından ekran görüntülerini
kaplayabilir ve sıralandığından

2
@ APAD1 - Bu hala onları göz kamaştırıyor. Bir görüntü farkı kullanın.
Quentin

1
Temelde çok geniş kapalı bir dupe İki HTML kaynağını karşılaştırın ve görsel farklılıkları görüntüleyin . Ayrıca, "iki html sayfasının görsel farkı" internette arama yapmak ürün ve kütüphanelerin uzun bir listesini getiriyor ...
Heretic Monkey

1
Smart Bear'ın TestComplete'in bu belgeleri yapabileceğine inanıyorum , ancak maliyet engelleyici olabilir.
Graham

Yanıtlar:


8

CSS ile ilgili bir webiste geliştirirken benzer bir şey yaptım . Bir HTML / CSS tarafından üretilen bir çıktıyı daha önce bir HTML / CSS ile oluşturulmuş bir görüntüyle karşılaştırmak zorunda kaldım.

Kodları base64 kodlu bir görüntüye dönüştüren dom-to-image kullandım . Bu resmi bir tuvalin içine yerleştiriyorum ve sonra her iki resim arasında karşılaştırma yapmak için pixelmatch kullanıyorum .

Aşağıda açıklamak için bir örnek verilmiştir:

Yukarıdaki kodda, bloklarımızı boyayacağımız 2 HTML bloğumuz ve 2 tuvalimiz var. Gördüğünüz gibi JS oldukça basit. Sondaki kod piksel eşleşmesini çalıştırır ve her iki tuvalin kaç farklı piksele sahip olduğunu gösterir. Her iki görüntünün de yüklendiğinden emin olmak için bir gecikme ekledim (daha sonra bazı etkinliklerle optimize edebilirsiniz)

Her iki resim arasındaki farkı vurgulamak ve görsel farkınızı elde etmek için üçüncü bir tuval de düşünebilirsiniz:

Farkı görmek için içeriği değiştirelim:

Kullandığım iki eklentinin nasıl çalıştığı hakkında daha fazla bilgi edinebilir ve daha ilginç seçenekler bulabilirsiniz.

Gösteriyi parçacık içinde kolaylaştırmak için boyutları 300x300'e sabitliyorum, ancak daha büyük yükseklik ve genişlik düşünebilirsiniz.


Güncelleme

Aynı sonucu veren iki düzen arasında karşılaştırma yapmak için daha gerçekçi bir örnek. Tuvalin genişliği / yüksekliği dinamik ve içeriğe dayalı olacaktır. Farkı olan sadece son tuvali göstereceğim.

Farklı bir resim kullanalım:


5

İşte DOM ile bazı ölçümler yapmak için bir fikir - sadece söz konusu metni sorgulanabilecek bir sınıfa sahip div'larla değiştirdim. Sonra tüm düğümlerin ofsetini yazdırabilirsiniz.

Ölçtüğümden karakter girintileri gerçekten ile aynı &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>


"Ben sadece divs tüm metin düğümleri yerini" Hayır, sadece yerini parçaları sen edildi görünce . Tüm &nbsp;karakterler ayrıca TextNodes'un bir parçasıdır. Bu önemlidir, çünkü çözümünüz programlı olarak çalışamaz.
Kaiido

3

İki sayfanın ekranlarını yazdırın ve pikselleri karşılaştırın.
Selenyum gibi bir web sürücüsü kullanabilir, iki ekranı bir görüntü dosyasında (png, jpg, vb.) Oluşturabilirsiniz - selenyumun bunu yapmak için bir yöntemi vardır - ve benzerliği karşılaştırmak için ikisinin piksellerini okumak için bir yazılım yazabilirsiniz.
Web sürücüsü, kodla kontrol edebileceğiniz bir tarayıcıdır. Web'deki görüntüleri karşılaştıran yazılımlar da bulabilirsiniz.

Bu bağlantıda daha fazla bilgi bulabilirsiniz: https://selenium.dev/


Pikselleri nasıl karşılaştırıyorsunuz? Bunu yapmanın otomatik bir yolu var mı? Ayrıca, HTML verdiğim örnekten çok daha uzun olsaydı ve ekrana sığmazsa ne olacak?
Purplejacket

2

Öncelikle görüntüleri yakalamak zorundayız

Yakalama Yöntemi 1

Klavyenizdeki (veya başka bir ekran görüntüsü aracındaki) ekran baskı düğmesini kullanın.

Ekrana sığacak kadar uzun veya geniş sayfalar için, her sayfanın birden fazla ekran görüntüsünü alın ve bunları fotoğraf düzenleyicinizde bir araya getirin. Büyük bir sayfanın üst üste binen ekran görüntülerini alabilir, ayrı katmanlara yerleştirebilir, ardından tüm sayfanın bir bileşimini oluşturmak için katmanları birleştirmeden önce parçaları tam olarak konumlandırmak için üst üste binen bölümleri kullanabilirsiniz.

Yakalama Yöntemi 2

Tüm sayfayı bir kerede yakalamak için fireshot gibi bir tarayıcı uzantısı kullanabilirsiniz .


İkinci olarak görüntüleri karşılaştırıyoruz

Yöntem 1

  1. Photoshop açın veya photopea'ya gidin .

  2. Ekran görüntüsünü bir katmana yapıştırın.

  3. Farklı bir katmana yapıştırarak ikinci sayfa için tekrarlayın.

  4. Katman görünürlüğünü aç / kapat ve değişiklikler açıkça görülecektir. Veya karşılaştırmak için üst katmanın opaklığını ayarlayın (ve / veya farklı karışım modları ayarlayın).

Yöntem 2

Tarayıcınızda yarı saydam görüntülerin yer paylaşımına izin veren pixel-perfect-2 gibi bir tarayıcı uzantısı kullanın . Bu, hizalama ve aralıkları kontrol etmek için de yararlı bir uzantıdır, çünkü tarayıcınızdaki ızgara görüntüsüne sahip sayfaları kaplayabilirsiniz.

Yöntem 3

Bir görüntü farklı aracı kullanın. Hızlı bir google araması, burada listelenemeyecek kadar çok olacak. Bazı kod editörleri, komut satırı araçları, Python komut dosyaları ve difüzör gibi çevrimiçi hizmetler için görüntü dif eklentileri vardır .


2

Pozisyonu ile aynı belgeye üst üste yerleştirebilirsiniz: mutlak; Ve belki daha yakından bakmak için yakınlaştırın.

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


Bu çok iyi! Bu fikri denedim, ancak <pre>etiketin <body>kenar boşluklarına göre garip yönleri nedeniyle hizalamalarını sağlayamadım. İçin stilleriniz #a, #b { ... }düzgün çalışıyor gibi görünüyor.
Purplejacket

2

İç çerçeveleri kullanarak iki sayfayı üst üste bindirin. Bu, iki sayfa arasındaki farkları görmenizi sağlayacaktır.

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 Snippet'lerini kullanarak bunu yapmanın bir yolu olduğundan şüpheleniyorum. Beni aydınlatmaktan çekinmeyin)


1

Burada gerçekten karmaşık ve akıllı kod yöntemleri var, bu yüzden burada basit,

Birinin ekran görüntüsünü alın, saydamlığı destekleyen bir resim düzenleyicide açın Photoshop gibi,

Ardından, CSS yolunuzdan ekran gösterisini alın ve yapıştırılan ikinci görüntüyü% 50 opaklığa ayarlayın ve sıralanıp hizalanmadığına bakın.


Sayfa ekrana sığmayacak kadar uzunsa ne olur?
Purplejacket

Photoshop'unuz veya onu destekleyen başka bir düzenleyiciniz varsa, en üst katmandaki karışım modunu farklı olarak ayarlayın. Görüntüler aynı ise, sabit siyah bir görüntü görürsünüz.
steveax

Evet. HTML bir dizedir. Dizeyi yazdırmak için cURL veya başka bir yöntem kullanın ve ardından karşılaştırın. Bunlar burada yapılan bazı aşırı mühendislik örnekleri.
Ususipse

@Purplejacket, erm Uygulamayı bir bütün olarak görüntüle, Ctrl + Shift + Print Screen,
Barkermn01

1

Şimdiye kadar gördüğüm gibi, birkaç kişi gerçek test araçlarından bahsediyor.

Usecase'iniz için birçok araç var (genellikle daha büyük çerçevelerin bir parçası):

Bu listeden alınan bir kaç isim vermek . Belki kendinizi arayın ve çevrenize uygun birini seçin.

Sürdürülebilir bir otomasyon oluşturmak istiyorsanız, saldırılara güvenmeyin. 'Sadece' KG olabilir, ancak gelecekteki sürümlerde a ** 'nızı ciddi şekilde kurtarabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.