2013-09-23 12 views
11

Próbuję pokazać, gdzie różnią się dwie strony HTML. Próbuję znaleźć sposób, w jaki sposób mogę porównać kod źródłowy HTML dwóch stron (prawie podobne) i pokazać/podkreślić różnice wizualnie (w interfejsie użytkownika).Porównaj dwa źródła HTML i różnice wizualne wyświetlania

Co próbowałem: Pomyślałem o zrobieniu migawki strony, a następnie użyj Resemble.js, aby porównać dwa obrazy. Ale to pokazuje bardzo małe różnice, a wyniki są czymś, co nie jest jasne.

Pomyślałem o porównaniu struktury DOM lub kodu źródłowego, a następnie pokażę, co lub gdzie właściwie dwie strony różnią się na UI.

Czy mogę to osiągnąć? Używam Selenium- Webdriver, aby uzyskać migawki i kod źródłowy HTML.

EDIT:

Chyba moje pytanie nie było jasne. Właściwie, chciałem dowiedzieć się, jaka jest różnica w treści HTML stron internetowych, aby wykryć aktualnie przeprowadzane testy A/B. Najpierw złapałem źródło html w plik tekstowy, a następnie porównałem go z wcześniej przechwyconym źródłem HTML przy użyciu Java-Diff util. To dało mi rzeczywiste linie, które różnią się dwoma plikami tekstowymi ze źródłem HTML.

Problem polega na tym, w jaki sposób mogę wyświetlać tę różnicę w interfejsie użytkownika, jak w przypadku wyróżniania obszarów, które znalazłem, są różne? Mam nadzieję, że to wszystko wyjaśni.

poniżej kod przedstawia linie, które różnią

List<String> original = fileToLines("HTML Source diff/originalSource.txt"); 
    List<String> revised = fileToLines("HTML Source diff/sourceAfterCookieClear.txt"); 

    // Compute diff. Get the Patch object. Patch is the container for computed deltas. 
    Patch patch = DiffUtils.diff(original, revised); 

    System.out.println("Printing Deltas\n"); 
    for (Delta delta : patch.getDeltas()) { 
     String revisedText = delta.getRevised().toString(); 
     String content = revisedText.substring(revisedText.indexOf(" [")+2,revisedText.indexOf("]]")); 
     writeTextToFile(content,"difference.html"); 
    } 

odprowadzeń w postaci kodu, który będzie pomocny.

+2

Używanie bez porównania – Shadow

+0

Myślałem o jakimkolwiek rozwiązaniu programowo –

+0

Czy rozwiązałeś już ten problem sam? Próbuję zbudować coś podobnego, po prostu z mapą zmian kodu, więc jest to dla mnie interesujące, jeśli istnieje już rozwiązanie, na którym mógłbym przynajmniej zbudować. – ctst

Odpowiedz

0

Zakładam, że chciałbyś zmienić dwa pliki kodu HTML. W tym przypadku chciałbym wskazać kierunku następującej biblioteki:

http://code.google.com/p/java-diff-utils/

+0

Dzięki za odpowiedź. Przeszedłem już przez to i to mówi mi, gdzie dwa źródła HTML różnią się, co jest w porządku. Utknąłem na punkcie, w jaki sposób powinienem pokazać tę różnicę jako interfejs użytkownika. Mam na myśli coś takiego - podkreślenie elementu, który ma tę różnicę lub coś w tym rodzaju. –

+0

Na tym etapie robi się to zbyt skomplikowane, w rzeczywistości trzeba zbudować silnik do parsowania HTML, a następnie renderować go na ekranie, zachowując jednocześnie odwzorowanie kodu. Zatem w swoim kodzie możesz wskazać element, a twój silnik będzie w stanie inteligentnie podświetlić ten obiekt (na podstawie reguł CSS, tj. Widoczności/nakładania/szerokości 0px). W tym momencie możesz to zrobić za pomocą 2 stron HTML i sprawić, że Twój silnik podświetli różnice. Na szczęście istnieje już biblioteka, która robi coś takiego: http://code.google.com/p/daisydiff/ – Husman

+0

Cóż, ja też myślałem o tym, jak dotrzeć do elementu, a następnie zastosować trochę reguły CSS, aby wyróżnić to. Tak, również przeszedłem przez ** daisydiff **, ale daje to również pewne wyjątki (wskaźnik zerowy w klasie Main). Nie rozumiem, dlaczego. Jest po prostu zbyt brudny. –

0

ok masz Zawsze rozwiązanie tylko wyjątkiem jednego tric. znajdź pierwszy identyfikator lub klasę w tekście poprawki za pomocą funkcji jscript i skoncentruj się na elemencie z jquery.coś jak poniżej:

dla wszystkich znaków do znalezienia 'id' var firstIdOfThePatchText = xxx; $ ('# firstIdOfThePatchText') .focus ...

cheer

5

użycie Pythona difflib. Na przykład:

import difflib 

file1 = open('file1.html', 'r').readlines() 
file2 = open('file2.html', 'r').readlines() 

htmlDiffer = difflib.HtmlDiff() 
htmldiffs = htmlDiffer.make_file(file1, file2) 

with open('comparison.html', 'w') as outfile: 
    outfile.write(htmldiffs) 

To utworzy plik HTML o nazwie comparison.html zawierający dyferencjału między dwoma plikami html file1.html i file2.html. Tutaj file1.html jest uważany za źródło lub oryginalna wersja cokolwiek jest bardziej odpowiednie dla Twojego przypadku i file2.html jest zmienił wersję lub nową wersję, ponownie, w zależności co jest bardziej odpowiednie tutaj.

Nadzieję, że pomaga!

+0

Czy mogę zapisać wynikowy plik w renderowanym formacie HTML zamiast w formacie źródłowym? – Umair

+0

@Umair tak, możesz. Wyjście 'make_file' w' HtmlDiff' * jest * renderowanym HTML. Spróbuj. W moim przykładzie utworzony plik ma nazwę "comparison.html" –

+0

Nie, skarbie, zapisuje 'compare.html' w formacie HTML-source ... nie jest renderowany HTML ... – Umair

0

Można umieścić każdy element z listy diff w kolorowym div tak, że jest to dobrze widoczne

można stwierdzić, że masz listę dyferencjału i przed/po dokumentach HTML. Jeśli potrafisz określić, z jakiego dokumentu HTML pochodzi każdy inny element, możesz wyszukać go za pomocą id w DOM i osadzić w kolorowym div, aby był dobrze widoczny.