Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Сравнение html кода двух страниц


(Alena) #1

На 2 разных сайтах есть 2  страницы которые должны быть абсолютно идентичные. Задача состоит в том что бы проверить действительно ли они одинаковые. Думала считать полностью весь код с одной страницы (включая теги) и сравнивать построчно.

Подскажите плиз как это можно реализовать на  Java+JUnit.

 


(apetrovskiy) #2

В NUnit есть методы AreEqual для коллекция и для строчных данных. Если странички должны быть в точности равны (вплоть до форматирования кода), сравнение страничек как объекты или как единая строка вполне подойдёт.

Если же одинаков только смысл, а, например, регистр символов разный - такое сравнение не подойдёт.

А сравнивать построчно смысла мало - может же быть расхождение не в строках, а в их расположении или в промежутках между строками. Если же хочется пойти путём сравнения строк - в мире полно отличных решений: fc, diff, winmerge (не знаю, есть ли у winmerge API). Они проверены, без преувеличения, миллионами пользователей, так что отчёт diff или fc - это как неоспоримое доказательство идентичности или расхождений. :)


(Mykhailo Poliarush) #3

ну если считать страницы в строки, то строки можно без проблем сравнить на равенство

вы хотите узнать как в JUnit написать соответствующий assert?


(apetrovskiy) #4

Это частный случай - что-то поменяно в строках. В общем случае может быть 1) разное кол-во строк, 2) разный порядок строк, 3) разные данные в строках 4) разные табуляции и т.п. (если это важно) в строках 5) разные вертикальные табуляции (если это важно).

Сравнение строк поможет с первыми тремя.

 

Если надо сравнить элементы, я бы предложил ещё и другой путь: собрать элементы скриптом, собрать атрибуты каждого элемента скриптом и поместить в массив (есть интересные примеры в инете, как сделать дикшинари из массива). Это можно даже сделать через селениум (скрипт сбора элементов и скрипт сбора атрибутов работают на стороне браузера, а драйвер чисто как переносчик данных до вашего кода. 

Я делал подобное (для другой цели, но шаги были те же).


(Mykhailo Poliarush) #5

понятно, что все может поменятся

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

фактически можно удалить все не нужные тебе символы и сравнить две строки

другой вопрос это написание парсинга, это требует времени, знаний и сил


(apetrovskiy) #6

Ладно, вот “моя часть” - сбор и доставка до потребителя/анализатора:

JavaScript (надо сказать, не самый лучший скрипт, но для начала подойдёт):

var all = document.getElementsByTagName('*');
var result = new Array();
for (i = 0; i < all.length; i++) {
    var singleResult = [];
    singleResult.push({
        key: "tagName",
        value: all[i].tagName
    });
    singleResult.push({
        key: "text",
        value: all[i].text
    });
    for (j = 0; j < all[i].attributes.length; j++) {
        singleResult.push({
            key: all[i].attributes[j].name,
            value: all[i].attributes[j].value
        });
    }
    result.push(singleResult);
}
return result;

можно ещё добавить XPath (взяв код, к примеру, отсюда: http://www.dzone.com/snippets/get-xpath)

драйвер:

$driver = Start-SeChrome | Enter-SeURL "http://lenta.ru";
($driver -as [OpenQA.Selenium.IJavaScriptExecutor]).executescript( ([string](Get-Content C:\......\getAllElementsInformation.txt)) ); # файл - это скрипт

(Максим Таран) #7

Самый простой способ использовать, например XMLUnit. Имеет разные настройки сравнения, И показывает разницу.


(Mykhailo Poliarush) #8

Да подход хороший, если HTML будет валидным, а иначе библиотека сразу тебе скажет, что нужно предоставить ему правильный xml. А так, библиотека отличная! Рекомендую.


(Сергей Блохин) #9

Я не знаю, как там с Java, но всегда можно вызвать внешнюю команду:

diff `curl first_uri 2> /dev/null/` `curl second_uri 2> /dev/null/`

(Максим Таран) #10

Можно, но это будет “тупое” сравнение построчное так сказать. Если я ничего не путаю


(Максим Таран) #11

Ну, если страница не валидна, то вообще, считаю, в топку такого сайтостроителя. :smile:


(Сергей Блохин) #12

Разве не этого хотел автор?

На 2 разных сайтах есть 2 страницы которые должны быть абсолютно идентичные.


(Максим Таран) #13

Ну, я подумал про логическое соответствие. Если имеется в виду вплоть до пробела, то да, наверное, твой вариант быстрее.