自动化网页测试与视觉对比

在现代软件开发流程中,自动化测试是确保软件质量的重要环节。Selenium 是一个流行的自动化测试工具,它能够模拟用户在浏览器上的操作,从而验证网页的功能是否正常。本文将介绍如何使用 Selenium 进行网页自动化测试,并结合ImageMagick进行视觉对比,以确保网页更新后的功能和视觉一致性。

ImageMagick是一个功能强大的图像处理库,它提供了丰富的图像处理功能。在本文中,将重点介绍它的比较功能。通过对比网页在不同状态下的截图,可以发现网页更新后可能存在的问题。

Selenium 简介

Selenium是一个用于自动化网页测试的工具,它可以独立使用,也可以嵌入到脚本中。通过 Selenium,可以模拟用户在浏览器上的操作,验证网页的功能是否正常。

ImageMagick的比较功能

ImageMagick 提供了多种图像处理功能,其中比较功能是在本文中将要使用的关键功能。通过对比网页在不同状态下的截图,可以发现网页更新后可能存在的问题。

VisualSmoke 解决方案

VisualSmoke 解决方案是一个示例项目,它展示了如何使用Selenium和 ImageMagick 进行网页自动化测试和视觉对比。这个解决方案包括一个标准的 ASP.NET MVC Razor 2 项目,以及一个测试项目。

测试概述

在 VisualSmoke.Web.Tests 项目中,设置了一些测试,以确保网页更新后的功能和视觉一致性。以下是测试的主要步骤:

在测试开始之前,需要设置测试环境。这包括设置要访问的 URL、截图的读写目录等。

public void SetupTest() { ActiveShots = ConfigurationManager.AppSettings["activeShotsPath"]; ApprovedShots = ConfigurationManager.AppSettings["approvedShotsPath"]; ErroredShots = ConfigurationManager.AppSettings["erroredShotsPath"]; DeltaShots = ConfigurationManager.AppSettings["deltaShotsPath"]; BaseDomain = string.Format("http://{0}/", ConfigurationManager.AppSettings["domain"]); CompareDomain = string.Format("http://{0}/", ConfigurationManager.AppSettings["compareDomain"]); PopulateUrls(); selenium = new DefaultSelenium("localhost", 4444, "*chrome", string.Format("http://{0}/", ConfigurationManager.AppSettings["domain"])); selenium.Start(); verificationErrors = new StringBuilder(); }

从 ApprovedPages.txt 文件中读取要进行截图测试的页面列表。这个文件允许控制哪些页面需要进行测试,而无需为每个页面创建一个单独的测试。

private void PopulateUrls() { UrlList = new List(); const string file = "VisualSmoke.Web.Tests.Selenium.ApprovedPages.txt"; using (var tr = GetInputFile(file)) { string line; while ((line = tr.ReadLine()) != null) { var page = new Page(); page.Name = line; if (line == "home") { page.ApprovedUrl = CompareDomain; page.ActiveUrl = BaseDomain; } else { page.ApprovedUrl = CompareDomain + line; page.ActiveUrl = BaseDomain + line; } UrlList.Add(page); } } }

ScreenshotCompareTest 方法将捕获已批准页面的基线,以便进行比较。然后,它将遍历要测试的页面列表,并使用Selenium.CaptureEntirePageScreenshot 方法捕获并保存截图。接着,使用 CompareImage 方法比较捕获的图像与已批准的对应图像。

[Test] public void ScreenshotCompareTest() { if (ConfigurationManager.AppSettings["baseline"] == "true") { CaptureApprovedPages(); } foreach (var url in UrlList) { selenium.Open(url.ActiveUrl); selenium.WaitForPageToLoad("30000"); selenium.CaptureEntirePageScreenshot(CaptureImagePath(url.Name), ""); var result = CompareImage(url.Name); if (result != CompareResult.Match) { if (result == CompareResult.Error) { verificationErrors.AppendLine(url.Name + ": " + LastException.Message); } else { verificationErrors.AppendLine(url.Name + " did not match the approved screenshot. " + string.Format("{0}images/screenshots/delta/{1}.png", UrlList[0].ActiveUrl, url.Name)); } } } }

当环境处于 QA 或业务用户批准的状态时,将 appSetting baseline 设置为 true。这将遍历 UrlList,捕获截图并将其保存到已批准的图像目录中。

private void CaptureApprovedPages() { foreach (var url in UrlList) { selenium.Open(url.ApprovedUrl); selenium.CaptureEntirePageScreenshot(ApprovedImagePath(url.Name), ""); } }

CompareImage 方法是执行 ImageMagick 工作以比较图像的主要方法。如果比较结果超出可接受范围,则将差异保存到 delta 文件夹中,以便在测试失败时由人工进行审查。

private CompareResult CompareImage(string name) { var activeImage = new MagickImage(CaptureImagePath(name)); var approvedImage = new MagickImage(ApprovedImagePath(name)); Assert.IsNotNull(activeImage); Assert.IsNotNull(approvedImage); var result = CompareResult.NoMatch; try { using (var delta = new MagickImage()) { var compareResult = activeImage.Compare(approvedImage, Metric.PeakAbsoluteError, delta); if (compareResult < 0.9) { result = CompareResult.Match; } else { delta.Write(string.Format("{0}\\{1}.png", DeltaShots, name)); } } } catch (Exception ex) { result = CompareResult.Error; LastException = ex; } return result; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485