在 Sikuli X Java 中查找图像
Posted
技术标签:
【中文标题】在 Sikuli X Java 中查找图像【英文标题】:finding image in Sikuli X Java 【发布时间】:2016-04-10 01:51:00 【问题描述】:我在尝试在屏幕上查找图像时遇到问题,我尝试了两种不同的方式,但它似乎对我不起作用。 我正在尝试使用在屏幕上显示的 ios 模拟器上运行的 Appium 来执行此操作,因此我认为这不是截屏的问题。
我正在运行 MAC OSX El Capitan 我已经在我的项目中导入了 Sikuli X java API
我还需要导入 MAC Sikuli 库 jar 吗?
这是我迄今为止尝试过的:
1.
Screen s = new Screen();
Pattern test = new Pattern("/Users/ealiaj/Desktop/Automation/workspace/WheelsUp - IOS/screenshot.jpg");
try
s.find(test);
catch (FindFailed e)
2.
Screen s = new Screen();
try
s.find("screenshot.jpg");
catch (FindFailed e)
我不断收到找不到错误。
错误信息:
FindFailed:在 S(0)[0,0 1440x900] 中找不到 /Users/ealiaj/Desktop/Automation/workspace/WheelsUp - IOS/screenshot1.jpg 第 2189 行,Region.java 文件中
这是屏幕上的图像,大红色矩形是我为其创建了屏幕截图并尝试查找的图像,但出现了错误。
我唯一能成功找到的是那个灰色矩形,或者至少它不会引发错误。
【问题讨论】:
您可以在不使用 Sikuli 的情况下执行此操作。在 appium 中创建函数,该函数捕获特定元素的屏幕截图(您要验证的内容)在运行时将其保存在您的系统中。并使用 Java 代码与您的基础图像文件匹配。 能否提供示例代码?谢谢 你能发布你看到的确切错误吗? 已在原帖中更新 @SadikAli 我也对您在评论中展示的方式感兴趣。您能否添加任何(文档)来源的示例或链接? 【参考方案1】:您可以使用此方法来验证图像:
@Test
public void verifyImages()
//WebElement img = driver.findElementByClassName("android.widget.ImageView");
//take screen shot
File screen = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.FILE);
//capture image of searched contact icon
List<WebElement > imageList = driver.findElementsByXPath("//*[@class='android.widget.ImageView' and @index='0']");
System.out.println(imageList.size());
System.out.println(i);
WebElement image = imageList.get(1);
Point point = image.getLocation();
//get element dimension
int width = image.getSize().getWidth();
int height = image.getSize().getHeight();
BufferedImage img = ImageIO.read(screen);
BufferedImage dest = img.getSubimage(point.getX(), point.getY(), width,
height);
ImageIO.write(dest, "png", screen);
File file = new File("Menu.png");
FileUtils.copyFile(screen, file);
//verify images
verifyImage("Menu.png", "Menu.png" );
public void verifyImage(String image1, String image2) throws IOException
File fileInput = new File(image1);
File fileOutPut = new File(image2);
BufferedImage bufileInput = ImageIO.read(fileInput);
DataBuffer dafileInput = bufileInput.getData().getDataBuffer();
int sizefileInput = dafileInput.getSize();
BufferedImage bufileOutPut = ImageIO.read(fileOutPut);
DataBuffer dafileOutPut = bufileOutPut.getData().getDataBuffer();
int sizefileOutPut = dafileOutPut.getSize();
Boolean matchFlag = true;
if(sizefileInput == sizefileOutPut)
for(int j=0; j<sizefileInput; j++)
if(dafileInput.getElem(j) != dafileOutPut.getElem(j))
matchFlag = false;
break;
else
matchFlag = false;
Assert.assertTrue(matchFlag, "Images are not same");
【讨论】:
这是否验证两个图像完全相同?我正在尝试在屏幕中查找图像。例如在整个图像中查找一个按钮。谢谢 是的,它确实找到了两个完全相同的图像。我用它来测试我身边的 2 张图像,它可以工作。谢谢。 嗨 Gaurav,要清楚,我有 image1 是整个屏幕,而 image2 是一个按钮,这会在 image1 中找到 image2? 是的,只需像在我的代码中一样传递定位器,我正在尝试匹配整个屏幕中的联系人图标。 测试它,如果你运行有问题,我会帮助你。谢谢【参考方案2】:错误消息表明程序正在查找 .PNG 文件,并且在您的代码中放置了一个 .JPG 文件。
【讨论】:
抱歉,当我将文件类型更改为 .PNG 时复制了它,它是 .PNG 两者兼有。以上是关于在 Sikuli X Java 中查找图像的主要内容,如果未能解决你的问题,请参考以下文章
Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化
Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化
Java 自动化 - 调用sukuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化