Можно ли использовать Sikuli, чтобы утверждать, что изображения одинаковы в режиме без графического интерфейса?
У меня есть тестовый сервер, который работает без головы. Один теста, который я хочу, чтобы проверить, что изображение подается от конкретного URL соответствует некоторому эталонному изображению.
Есть ли в Sikuli API, который может напрямую принимать изображение в виде потока и сравнивать его с другим изображением, взятым из файла локальных ресурсов? К сожалению, нет полного учебника по Java API Sikuli, все, что я нашел, это учебники, которые предполагают, что дисплей доступен.
Я буду рад видеть любые примеры или, по крайней мере, ссылки на необходимые части Javadocs Sikuli. Также приветствуются предложения по другим подходам.
2 ответа
Чтобы использовать Sikuli вам нужно
- Базовое изображение, на котором будет искать другое изображение.
- Изображение, которое будет искать в другом изображении.
Если изображение 1 - это изображение вашего локального ресурса, вы можете создать экземпляр org.sikuli.Finder с путем к изображению и областью этого изображения, в которой будет выполняться поиск. Пример (уровень Java):
finder = new Finder("path/to/image", new Region(0, 0, <imgwidth>, <imgheight>));
Если изображение 1 - ваш поток, вы должны каким-то образом сделать из него BufferedImage (я не знаю, как это сделать лучше). Затем вы можете сделать org.sikuli.ScreenImage из этого BufferedImage с помощью java.awt.Rectangle и org.sikuli.Region.
finder = new Finder(new ScreenImage(new Rectangle(0,0,<imgwidth>,<imgheight>), bufferedImage), new Region(0,0,<imgwidth>,<imgheight>))
После того, как вы создали искатель из изображения 1, вы можете искать изображение 2 в этом изображении.
Опять же, у вас есть две возможности. Если второе изображение - это изображение вашего локального ресурса, вы можете создать объект org.sikuli.Pattern с расположением файла:
pattern = new Pattern("path/to/image.png");
Иначе, если это ваш поток, вы должны каким-то образом сделать BufferedImage из потока. Затем вы можете создать шаблон из этого изображения:
pattern = new Pattnern(bufferedImage);
В качестве последнего шага теперь вы можете запустить Finder для поиска шаблона:
finder.find(pattern);
Вы можете проверить, нашел ли нашедший что-либо с помощью:
finder.hasNext();
И вы должны быть в состоянии повторить все результаты с:
for (Match m : finder):
//do something with the match
Я надеюсь, что смогу вам помочь, хотя вашему вопросу уже несколько недель.
Ниже приведен код, помогающий утверждать изображения
// сделать скриншоты
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
//copy it some location
FileUtils.copyFile(scrFile, new File("C:\\screenshot.png"));
Finder f = new Finder("C:\\screenshot.png");
System.out.println("abc");
f.find("C:\\chrome3.png", 0.95);
while(f.hasNext()){
System.out.println("found");
Match m= f.next();
f.destroy();
}
}
catch (IOException e)
{
e.printStackTrace();
}