如果 HTML 代码没有变化,如何检查图像是否已更改?

How to check that the image was changed if there're no changes in HTML code?

如果 HTML 代码没有变化,如何检查图像是否已更改?这听起来可能有点复杂,所以我会尝试添加一些细节。

首先,我使用 Kotlin + Selenide 编写测试,但如果你的 tips\tricks\answers 将在 Java + Selenium 中,我完全没问题。

其次,情况是这样的: 我有一个用户未来厨房的可视化工具,其中 he\she 可以 add\edit\delete 不同的东西,例如水槽和水龙头。 有几种预设:其中一些带有橱柜,一些带有桌子,带椅子的桌子等。 它的编码是这样的:<a href="#" class="preset-buttons-selected" style="background-image: url("https://s3.amazonaws.com/bla-bla-bla/some_image.png");"></a>

因此,当用户更改某些内容时,例如添加一个接收器,图像实际上已更改,但 html 代码中没有任何更改,这就是为什么我 CANNOT 验证自动测试中的更改。 我看到从 s3.amazonaws.com 中提取了新图像,但它仅在浏览器控制台的“网络”选项卡中可见,在页面的 html 代码中不可见。

所以,我的问题是,我能否以某种方式验证我的 UI 自动化测试中的更改?

我的第一个想法是获取更改前后图像的哈希值,然后查看哈希值是否相同。这会告诉您图像是否已更改。

这是一个简单的示例和一个您可以在代码中使用的函数。

此函数接收图像的 URL 和该图像的 returns MD5 哈希值。

public static String getHashOfImage(URL imageUrl) throws IOException, NoSuchAlgorithmException
{
    BufferedImage buffImg = ImageIO.read(imageUrl);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ImageIO.write(buffImg, "png", outputStream);
    byte[] data = outputStream.toByteArray();

    MessageDigest md5 = MessageDigest.getInstance("MD5");
    md5.update(data);
    byte[] digest = md5.digest();

    return new BigInteger(1, digest).toString(16);
}

这是一个使用包含三个随机图像的测试站点的简单示例。您应该看到为三个图像中的每一个打印的散列。每次加载页面时,都会加载一组不同的三张图片,但是如果你 运行 它几次,你应该得到一个实例,其中两个是相同的,这样你就可以验证哈希值确实是相同的,当两个图像相同。

driver.get("http://the-internet.herokuapp.com/dynamic_content");

List<WebElement> images = driver.findElements(By.cssSelector("img"));
for (int i = 1; i < images.size(); i++)
{
    System.out.println(getHashOfImage(new URL(images.get(i).getAttribute("src"))));
}

示例输出看起来像

c8977e445530e09a06ce368f7f5e70dd
c8977e445530e09a06ce368f7f5e70dd
62baf598cd68eec5725df67e33c05cba

前两张图片相同但与第三张不同。

部分代码改编自https://sites.google.com/site/matthewjoneswebsite/java/md5-hash-of-an-image