Сравнение двух изображений
#1 Гость_Volk_*
Отправлено 06 апреля 2011 - 12:32
#2
Отправлено 06 апреля 2011 - 13:06
#3 Гость_Volk_*
Отправлено 06 апреля 2011 - 13:09
ну изображение то дернуть надо селениумом. Как это лучше сделать не в курсе?Вообще selenium не подходит для сравнения изображений, это надо делать средствами языка программирования, в данном случае - java.
видел что-то вроде selenium.captureScreenshot().
А по джаве в этмо случае помочь не можете?
#4
Отправлено 06 апреля 2011 - 13:11
Получить Selenium'ом картинку с веб-страницы можно несколькими способами:
1. Сохранить её средствами браузера в файловую систему и оттуда читать.
2. Получить её полный URL через Selenium и послать HTTP-запрос напрямую из кода теста (не забыть скопировать куки если тест находится за логином).
3. Как-нибудь извратиться с JavaScript и вернуть оттуда картинку в виде строки - не уверен, что это возможно ввиду ограничений JS.
Наиболее удобный способ 2.
#5
Отправлено 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();
правда не уверен что это вам подойдет, вам же конкретное изображение со страницы нужно
#6 Гость_Volk_*
Отправлено 06 апреля 2011 - 14:14
selenium.captureScreenshot("logo.png");
и я получаю скриншот экрана. А мне нужно сохранять конкретное изображение, элемент со страницы... Чтобы потом его сравнивать с уже имеющимся на диске и делать определенные выводы.
Вопрос: как посредством селениума сохранить отдельное изображение, вопрос 2: как описать посредством джавы сравнение двух изображений на идентичность?
vitorg, а опишите подробнее как это делать? Потому что я не представляю как через селениум получить код картинки а потом послать его чере хттп чтобы потом сохранить, если правильно понял?
#7
Отправлено 06 апреля 2011 - 14:15
#8 Гость_Volk_*
Отправлено 06 апреля 2011 - 14:23
120x190 px, ~20Kb.Большого ли размера изображения? Критична ли скорость?
время 10 секунд.
Но если вы знаете любой метод по теме, пишите, буду признателен в любом случае.
#9
Отправлено 06 апреля 2011 - 14:36
Самый простой способ, как я говорил, получить URL картинки через Selenium, а потом дёрнуть эту картинку отдельным HTTP-запросом прямо из Java, предварительно скопировав аккуратненько все нужные куки. Вас именно этот способ интересует? Что конкретно вызывает затруднения, вроде всё должно быть просто кроме разве что копирования защищённых кук (httpOnly) если у вас такие имеются.а опишите подробнее как это делать? Потому что я не представляю как через селениум получить код картинки а потом послать его чере хттп чтобы потом сохранить, если правильно понял?
Типа может курьером отправить? :)Большого ли размера изображения? Критична ли скорость?
#10
Отправлено 06 апреля 2011 - 14:38
Если сервер никак не меняет изображение на своей стороне, то проще всего конечно будет сравнить бинарно полученное изображение и эталонное.вопрос 2: как описать посредством джавы сравнение двух изображений на идентичность?
#11
Отправлено 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 способов придумать.
#12 Гость_Volk_*
Отправлено 07 апреля 2011 - 05:53
vitorg а напиши как, а то я чето не сталкивался с такой командой в селениум.Cамый простой способ, как я говорил, получить URL картинки через Selenium
OVA спасибо за метод! Буду пробовать как только разберусь с получением картинки...
Я поясню для чего мне все это. Мне поставили определенную задачу, частью которой является сохранение фотографии знаменитости и сравнивание с уже сохраненной такой же итп:
hxxp://www.kinopoisk.ru/level/75/
Игра на джаваскрипте, не знаю насколько это актуально для селениума, но мне кажется все можно
#13
Отправлено 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 картинки.
#14
Отправлено 07 апреля 2011 - 06:23
#15
Отправлено 07 апреля 2011 - 08:52
Здесь многое зависит от того каким образом картинка вставлена в страницу, например, для логотипа Яндекс будет типа такого: selenium.getAttribute("css=//td[class='l-head-left'] img@src").vitorg а напиши как, а то я чето не сталкивался с такой командой в селениум.
#16
Отправлено 07 апреля 2011 - 10:07
Здесь многое зависит от того каким образом картинка вставлена в страницу, например, для логотипа Яндекс будет типа такого: selenium.getAttribute("css=//td[class='l-head-left'] img@src").
vitorg а напиши как, а то я чето не сталкивался с такой командой в селениум.
Как вариант ещё яваскриптом можно добывать через getEval.
У меня в одном из тестов url картинок через gem mechanize в руби добываются.
Этот гем представляет собой что-то вроде легковесного браузера. По урл возвращает объект с элементами страницы, прям как в яваскрипте, к тому же работает с куками, что немаловажно. Соответственно, в этом объекте удобно копаться не тему выдёргиваний нужной информации со страницы.
Получилось, что работает он быстрее чем селениум, что было важно на тот момент.
Очень удобно. Наверняка в яве есть подобные библиотеки или как оно в яве зовётся :)
#17 Гость_Volk_*
Отправлено 07 апреля 2011 - 13:52
Пример: <a href="/...">Link</a>
Так вот как получить нам сам текст "Link" конкретной ссылки? То есть текст между тегами
так же обнаружил что в моем случае просто выдернуть url не получается, т.к. на картинку выдается все время разная ссылка причем не содержащая в себе картинку, пример:
hxxp://www.kinopoisk.ru/handler_guess_image.php?rnd=0.41730400245927657
Но если сохранять из браузера правой кнопкой-Сохранить, то картинка сохраняется нормально. Кто знает какими средствами это можно сделать, т.к. селениум этого не умеет?
HELP!
#18
Отправлено 07 апреля 2011 - 16:40
Текст ссылки проще. Нашли ссылку и дерем оттуда текст.
var element = this.page().findElement(locator);
У элемента дерем свойство текст.
#19
Отправлено 07 апреля 2011 - 18:19
Не поверишь - selenium.getText("locator") :)vitorg как получать атрибут понял! Спасибо. Полезная вещь. А ты случайно не знаешь как получить например текст ссылки?
Пример: <a href="/...">Link</a>
Так вот как получить нам сам текст "Link" конкретной ссылки? То есть текст между тегами
Рекомендую почитать жабадоки интерфейса Selenium.
Умеет. Приведи пример страницы с картинкой URL которой хочешь получить.Но если сохранять из браузера правой кнопкой-Сохранить, то картинка сохраняется нормально. Кто знает какими средствами это можно сделать, т.к. селениум этого не умеет?
#20 Гость_Volk_*
Отправлено 08 апреля 2011 - 07:03
vitorg поверил! И вправду оно))
hxxp://www.kinopoisk.ru/level/75/
нужно нажать старт, и авторизоваться (login: Haunds, pas: test). И вот эту картинку мне нужно сохранять. Ссылка все время динамичная, внутри код, тоже динамичный. Поэтому остается только один вариант: сохранять из браузера на hd правой кнопкой. Кстати, может мне приснилось но кажется можно было как-то эмулировать нажатие правой кнопки мыши селениумом, тока потом вроде ниче нельзя...
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных