Перейти к содержимому

Сравнение двух изображений


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 28

#1 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 06 апреля 2011 - 12:32

как описать подобный метод? Мне нужно селениумом дергать изображение и сравнивать его с уже имеющимся. Пользуюсь Selenium RC + Eclipse + Java

#2 Freiman

Freiman

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 591 сообщений
  • ФИО:Андрей Адеркин
  • Город:Йошкар-Ола

Отправлено 06 апреля 2011 - 13:06

Вообще selenium не подходит для сравнения изображений, это надо делать средствами языка программирования, в данном случае - java.
  • 0

#3 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 06 апреля 2011 - 13:09

Вообще selenium не подходит для сравнения изображений, это надо делать средствами языка программирования, в данном случае - java.

ну изображение то дернуть надо селениумом. Как это лучше сделать не в курсе?
видел что-то вроде selenium.captureScreenshot().
А по джаве в этмо случае помочь не можете?

#4 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 06 апреля 2011 - 13:11

Интересует сравнение на полное совпадение?

Получить Selenium'ом картинку с веб-страницы можно несколькими способами:
1. Сохранить её средствами браузера в файловую систему и оттуда читать.
2. Получить её полный URL через Selenium и послать HTTP-запрос напрямую из кода теста (не забыть скопировать куки если тест находится за логином).
3. Как-нибудь извратиться с JavaScript и вернуть оттуда картинку в виде строки - не уверен, что это возможно ввиду ограничений JS.

Наиболее удобный способ 2.
  • 0

#5 VitalyD

VitalyD

    Опытный участник

  • Members
  • PipPipPipPip
  • 285 сообщений
  • Город:Санкт-Петербург

Отправлено 06 апреля 2011 - 13:31


Вообще selenium не подходит для сравнения изображений, это надо делать средствами языка программирования, в данном случае - java.

ну изображение то дернуть надо селениумом. Как это лучше сделать не в курсе?
видел что-то вроде selenium.captureScreenshot().
А по джаве в этмо случае помочь не можете?



сделать скриншот экрана с помощью селениума:

            String base64Screenshot = selenium.captureScreenshotToString();
            byte[] decodedScreenshot = Base64.decodeBase64(base64Screenshot.getBytes());
            FileOutputStream fos = new FileOutputStream(new File(path));
            fos.write(decodedScreenshot);
            fos.close();

правда не уверен что это вам подойдет, вам же конкретное изображение со страницы нужно
  • 0

#6 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 06 апреля 2011 - 14:14

да, все просто
selenium.captureScreenshot("logo.png");
и я получаю скриншот экрана. А мне нужно сохранять конкретное изображение, элемент со страницы... Чтобы потом его сравнивать с уже имеющимся на диске и делать определенные выводы.
Вопрос: как посредством селениума сохранить отдельное изображение, вопрос 2: как описать посредством джавы сравнение двух изображений на идентичность?

vitorg, а опишите подробнее как это делать? Потому что я не представляю как через селениум получить код картинки а потом послать его чере хттп чтобы потом сохранить, если правильно понял?

#7 vaha

vaha

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Илья

Отправлено 06 апреля 2011 - 14:15

Большого ли размера изображения? Критична ли скорость?
  • 0

#8 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 06 апреля 2011 - 14:23

Большого ли размера изображения? Критична ли скорость?

120x190 px, ~20Kb.
время 10 секунд.

Но если вы знаете любой метод по теме, пишите, буду признателен в любом случае.

#9 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 06 апреля 2011 - 14:36

а опишите подробнее как это делать? Потому что я не представляю как через селениум получить код картинки а потом послать его чере хттп чтобы потом сохранить, если правильно понял?

Самый простой способ, как я говорил, получить URL картинки через Selenium, а потом дёрнуть эту картинку отдельным HTTP-запросом прямо из Java, предварительно скопировав аккуратненько все нужные куки. Вас именно этот способ интересует? Что конкретно вызывает затруднения, вроде всё должно быть просто кроме разве что копирования защищённых кук (httpOnly) если у вас такие имеются.

Большого ли размера изображения? Критична ли скорость?

Типа может курьером отправить? :)
  • 0

#10 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 06 апреля 2011 - 14:38

вопрос 2: как описать посредством джавы сравнение двух изображений на идентичность?

Если сервер никак не меняет изображение на своей стороне, то проще всего конечно будет сравнить бинарно полученное изображение и эталонное.
  • 0

#11 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 07 апреля 2011 - 03:51

Как слить картинку:
1. Средствами языка. Тут правда есть ньюанс что не все решения подходят, потому как возможность сдампить картинку может зависеть от сессии.
2. Получить урл картинки, открыть его где-нибудь селениумом и сделать скрин этой картинки.
3. То же что и п.2 только сторонними средствами заставить браузер сохранить картинку куда надо. Робот, AutiIt и прочие Sikuli вполне сойдут. Потом уже дело техники сделать дифф двух файликов.


Вот совсем простой вариант сравнения двух картинок в java:
File file1 = new File("path/image1.jpg");
File file2 = new File("path/image2.jpg");

BufferedImage image1 = ImageIO.read(file1);
BufferedImage image2 = ImageIO.read(file2);

int columns = image1.getWidth();
int rows = image1.getHeight();

for (int row=0; row<rows; row++){
for (int col=0; col<columns; col++){
int rgb = image1.getRGB(col, row);
int rgb2= image2.getRGB(col, row);
//compare here
}
}

Если подумать, можно еще 100500 способов придумать.
  • 0

#12 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 07 апреля 2011 - 05:53

Cамый простой способ, как я говорил, получить URL картинки через Selenium

vitorg а напиши как, а то я чето не сталкивался с такой командой в селениум.

OVA спасибо за метод! Буду пробовать как только разберусь с получением картинки...
Я поясню для чего мне все это. Мне поставили определенную задачу, частью которой является сохранение фотографии знаменитости и сравнивание с уже сохраненной такой же итп:
hxxp://www.kinopoisk.ru/level/75/
Игра на джаваскрипте, не знаю насколько это актуально для селениума, но мне кажется все можно

#13 kvarik

kvarik

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Борис Ходок

Отправлено 07 апреля 2011 - 05:59

Как слить картинку:
1. Средствами языка. Тут правда есть ньюанс что не все решения подходят, потому как возможность сдампить картинку может зависеть от сессии.
2. Получить урл картинки, открыть его где-нибудь селениумом и сделать скрин этой картинки.
3. То же что и п.2 только сторонними средствами заставить браузер сохранить картинку куда надо. Робот, AutiIt и прочие Sikuli вполне сойдут. Потом уже дело техники сделать дифф двух файликов.


Вот совсем простой вариант сравнения двух картинок в java:
File file1 = new File("path/image1.jpg");
File file2 = new File("path/image2.jpg");

BufferedImage image1 = ImageIO.read(file1);
BufferedImage image2 = ImageIO.read(file2);

int columns = image1.getWidth();
int rows = image1.getHeight();

for (int row=0; row<rows; row++){
for (int col=0; col<columns; col++){
int rgb = image1.getRGB(col, row);
int rgb2= image2.getRGB(col, row);
//compare here
}
}

Если подумать, можно еще 100500 способов придумать.


А не проще проверить md5 картинок? Времени это займёт гораздо меньше, чем попиксельно сравнивать 2 картинки.
  • 0

#14 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 07 апреля 2011 - 06:23

Можно. Но попиксельно веселее. К тому же дифф можно будет потом нарисовать
  • 0

#15 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 07 апреля 2011 - 08:52

vitorg а напиши как, а то я чето не сталкивался с такой командой в селениум.

Здесь многое зависит от того каким образом картинка вставлена в страницу, например, для логотипа Яндекс будет типа такого: selenium.getAttribute("css=//td[class='l-head-left'] img@src").
  • 0

#16 kvarik

kvarik

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Борис Ходок

Отправлено 07 апреля 2011 - 10:07


vitorg а напиши как, а то я чето не сталкивался с такой командой в селениум.

Здесь многое зависит от того каким образом картинка вставлена в страницу, например, для логотипа Яндекс будет типа такого: selenium.getAttribute("css=//td[class='l-head-left'] img@src").


Как вариант ещё яваскриптом можно добывать через getEval.
У меня в одном из тестов url картинок через gem mechanize в руби добываются.
Этот гем представляет собой что-то вроде легковесного браузера. По урл возвращает объект с элементами страницы, прям как в яваскрипте, к тому же работает с куками, что немаловажно. Соответственно, в этом объекте удобно копаться не тему выдёргиваний нужной информации со страницы.
Получилось, что работает он быстрее чем селениум, что было важно на тот момент.
Очень удобно. Наверняка в яве есть подобные библиотеки или как оно в яве зовётся :)
  • 0

#17 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 07 апреля 2011 - 13:52

vitorg как получать атрибут понял! Спасибо. Полезная вещь. А ты случайно не знаешь как получить например текст ссылки?
Пример: <a href="/...">Link</a>
Так вот как получить нам сам текст "Link" конкретной ссылки? То есть текст между тегами

так же обнаружил что в моем случае просто выдернуть url не получается, т.к. на картинку выдается все время разная ссылка причем не содержащая в себе картинку, пример:
hxxp://www.kinopoisk.ru/handler_guess_image.php?rnd=0.41730400245927657

Но если сохранять из браузера правой кнопкой-Сохранить, то картинка сохраняется нормально. Кто знает какими средствами это можно сделать, т.к. селениум этого не умеет?
HELP!

#18 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 07 апреля 2011 - 16:40

Autoit, Siculi, Java Robot

Текст ссылки проще. Нашли ссылку и дерем оттуда текст.
var element = this.page().findElement(locator);
У элемента дерем свойство текст.
  • 0

#19 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 07 апреля 2011 - 18:19

vitorg как получать атрибут понял! Спасибо. Полезная вещь. А ты случайно не знаешь как получить например текст ссылки?
Пример: <a href="/...">Link</a>
Так вот как получить нам сам текст "Link" конкретной ссылки? То есть текст между тегами

Не поверишь - selenium.getText("locator") :)
Рекомендую почитать жабадоки интерфейса Selenium.

Но если сохранять из браузера правой кнопкой-Сохранить, то картинка сохраняется нормально. Кто знает какими средствами это можно сделать, т.к. селениум этого не умеет?

Умеет. Приведи пример страницы с картинкой URL которой хочешь получить.
  • 0

#20 Гость_Volk_*

Гость_Volk_*
  • Guests

Отправлено 08 апреля 2011 - 07:03

OVA спасибо сейчас буду пробовать, цель уже близко)
vitorg поверил! И вправду оно))

hxxp://www.kinopoisk.ru/level/75/
нужно нажать старт, и авторизоваться (login: Haunds, pas: test). И вот эту картинку мне нужно сохранять. Ссылка все время динамичная, внутри код, тоже динамичный. Поэтому остается только один вариант: сохранять из браузера на hd правой кнопкой. Кстати, может мне приснилось но кажется можно было как-то эмулировать нажатие правой кнопки мыши селениумом, тока потом вроде ниче нельзя...


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных