在 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 中查找图像的主要内容,如果未能解决你的问题,请参考以下文章

Sikuli--基于像素的图像识别(JAVA)

sikuli : 无法找到 Flash 弹出窗口中的图像

Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化

Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化

如何在java中使用sikuli进行自动化测试

Java 自动化 - 调用sukuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化