И хоть это код на Питоне, но думаю он будет понятен.
# coding=utf-8
from PIL import Image, ImageChops
etalon_scr = [‘D:\etalon\1.png’, ‘D:\etalon\2.png’, ‘D:\etalon\3.png’]
test_scr = []
test_pages = [‘http://abra-kadabra/page1.html’, ‘http://abra-kadabra/page2.html’, ‘http://abra-kadabra/page3.html’]
#Собсно, само сравнение картинок.
#Cначала при помощи ImageChops.difference сравним списки пикселей двух картинов и найдём их разность. На входе ему необходимы две последовательности из пикселей, на выходе он выдаёт один список из последовательностей, где показано отклонение двух пикселей.
#То есть difference((100, 100, 100), (100, 100, 100)) –> (0, 0, 0)
#difference((100, 100, 100), (50, 75, 100)) –> (50, 25, 0)
#Потом посчитаем количество “нулевых” последовательностей
#Сравним общее количество пикселей с количеством нулевых последовательностей. Очевидно, что если эти числа не равны, то картинки отличаются.
def compare_img(path_to_etalon, path_to_test):
img_1 = Image.open(path_to_etalon).load()
img_2 = Image.open(path_to_test).load()
dif_pixels = ImageChops.difference(img_1, img_2)
all_pixels = len(dif_pixels)
null_pixels = dif_pixels.count((0, 0, 0)) # Посчитаем, что у нас RGB-картинка.
if all_pixels != null_pixels:
print 'Беда-беда, картинки отличаются.
Ходим по страницам, делаем скриншоты и добавляем путь к скриншотам в список
for x in range(len(test_pages)):
driver.get(test_pages[x])
scr_name = ‘D:\test\test-’ + str(x + 1) + ‘.png’
driver.get_screenshot_as_file(scr_name)
test_scr.append(scr_name)
#Сравниваем скриншоты
for x in range(len(etalon_scr)):
compare_img(etalon_scr[x], test_scr[x])
По идее скрипт должен быть рабочим :) Команды писал по памяти и где-то мог промахнуться. Если что, то обращайтесь к доке по Питону 2.7 (http://docs.python.org/library/) и Python Image Library (http://www.pythonware.com/products/pil/).
Если что-то непонятно в логике работы скрипта, то задавайте вопросы - отвечу по возможности.
P.S. Для красоты сюда ещё можно добавить функционал по обведению в кружочки отличающихся пикселей, но эту часть кода уже сами пишите :)