如何使用Selenium比较两个图像

时间:2016-06-02 17:56:32

标签: image selenium-webdriver

我喜欢比较两张图片。 imagemagic工具使用cmd提示符为我做这个。它比较两个图像(例如,按钮的位置不同),并在新的gif图像中输出结果图像,突出显示差异。但是,我想要一些生成这种新图像的工具,但只有在存在差异的情况下。请建议我怎样才能使用任何工具,或者即使使用selenium和java也可以。 imagemagic生成新的结果图像,即使它们之间没有差异。

编辑: 我已经完成了RnD并得出结论,imagemagic + iam4java可以通过硒来比较图像但是仍然无法找到如何在产生差异的情况下产生输出图像的条件

4 个答案:

答案 0 :(得分:4)

使用java比较2张图片:

    BufferedImage imgA = ImageIO.read(new File("C:/img/picA.jpg")); 
    BufferedImage imgB = ImageIO.read(new File("C:/img/picB.jpg"));   

    boolean bufferedImagesEqual(BufferedImage img1, BufferedImage img2) {
    if (img1.getWidth() == img2.getWidth() && img1.getHeight() == img2.getHeight()) {
     for (int x = 0; x < img1.getWidth(); x++) {
      for (int y = 0; y < img1.getHeight(); y++) {
       if (img1.getRGB(x, y) != img2.getRGB(x, y))
        return false;
       }
      }
     } else {
        return false;
     }
     return true;
    }

要生成差异图像,您可以执行以下操作:

    private static void subtractImages(BufferedImage image1, BufferedImage image2) throws IOException {
    BufferedImage image3 = new BufferedImage(image1.getWidth(), image1.getHeight(), image1.getType());
    int color;
    for(int x = 0; x < image1.getWidth(); x++)
        for(int y = 0; y < image1.getHeight(); y++) {
            color = Math.abs(image2.getRGB(x, y) - image1.getRGB(x, y));                
            image3.setRGB(x, y, color);
        }
    ImageIO.write(image3, "bmp",  new File("image.bmp"));
 }

Source of subtractImages method

Source of bufferedImagesEqual method

Gist with a working example

答案 1 :(得分:0)

您可以尝试使用applitools(http://applitools.com/)进行图像比较测试。它将图像保存在其服务器上,并仅在出现故障时打印日志中的图像链接。因此,如果您的测试通过(图像相同) - 您只会看到绿色测试。如果图像之间存在差异 - 测试将失败,并且您将在日志中看到指向applitools的链接,在该链接中,您将使用突出显示的差异区域获取图像,并且能够看到基线图像(以进行比较)用自己的眼睛:))。

答案 2 :(得分:0)

这就是我所做的... 打开图像并将图像存储为文件Java IO

NewImage = new File(NewImagePath)//从路径NewImagePath获取newImage Original = new File(OriginalPath)//从路径OriginalPath获取原始

创建了一个函数“ getImagePercentage”,该函数比较映像并重新运行机器%percetage,如果两个映像相同,则为100%,否则为其他任何值。

调用函数为:getImagePercentage(Original,NewImage),

getImagePercentage(File fileA,File fileB){//函数getImagePercentage的开始

    def percentage = 0;
    BufferedImage biA = ImageIO.read(fileA); // reads fileA into bufferedImage
    DataBuffer dbA = biA.getData().getDataBuffer();
    int sizeA = dbA.getSize();
    BufferedImage biB = ImageIO.read(fileB); // reads fileA into bufferedImage
    DataBuffer dbB = biB.getData().getDataBuffer();
    int sizeB = dbB.getSize();
    int count = 0;
    // compare data-buffer objects //
    if (sizeA == sizeB) { // checks the size of the both the bufferedImage

        for (int i = 0; i < sizeA; i++) {

            if (dbA.getElem(i) == dbB.getElem(i)) { // checks bufferedImage array is same in both the image
                count = count + 1;
            }
        }
        percentage = (count * 100) / sizeA; // calculates matching percentage
    } else {
        System.out.println("Both the images are not of same size");
    }
    return percentage; // returns the matching percentage value
}

答案 3 :(得分:-1)

字符串applicationloader = TenantLoader_lnk.getAttribute(“ src”);

        BufferedImage expected = ImageIO.read(new File("local image file path"));
        BufferedImage actual = ImageIO.read(new URL(applicationloader));

        if(actual.getWidth()==expected.getWidth() && actual.getHeight()==expected.getHeight());
        {
            for(int x=0;x<expected.getWidth();x++)
            {
                for(int y=0;y<expected.getHeight();y++)
                {
                    assertTrue(actual.getRGB(x, y)==expected.getRGB(x, y), "Image is not same hence failing");
                }
            }
        }