是否有可能使用Sikuli断言图像在无GUI模式下是相同的?

时间:2012-11-05 09:58:35

标签: java image-processing automated-tests sikuli

我有一个无头的测试服务器。我想要的一个测试是检查特定URL提供的图像是否与某些参考图像匹配。

Sikuli中是否有API可以直接接受图像作为流并将其与从本地资源文件中获取的其他图像进行比较?不幸的是,没有关于Sikuli的Java API的完整教程,我发现所有教程都假定有一个显示器可供使用。

我很高兴看到任何示例或至少链接到Sikuli javadocs所需的部分。此外,欢迎提出其他方法的建议。

2 个答案:

答案 0 :(得分:4)

要使用Sikuli,你需要

  1. 将在其上搜索其他图像的基本图像。
  2. 将在另一幅图像中搜索的图像。
  3. 如果图像1是您的本地资源图像,则可以创建一个org.sikuli.Finder实例,其中包含图像的路径和将要搜索的此图像的区域。 示例(java级别):

    finder = new Finder("path/to/image", new Region(0, 0, <imgwidth>, <imgheight>));
    

    如果图像1是你的流,你必须以某种方式制作一个BufferedImage(我不知道最好的方法)。 然后你可以借助java.awt.Rectangle和org.sikuli.Region从这个BufferedImage中创建一个org.sikuli.ScreenImage。

    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
    

    我希望我可以帮助你,虽然你的问题已经有几个星期了。

答案 1 :(得分:0)

下面的代码有助于断言图像

//截屏

  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();
  }