У меня есть приложение .NET MAUI, для которого я хочу написать несколько тестов Appium. Раньше у меня были проблемы с изменениями, внесенными в новую версию .NET MAUI, когда макеты ломались и выходили за пределы доступного экрана, а кнопки обрезались и т. д. p>
Поэтому я решил, что мне также нужны тесты, которые захватывают снимок экрана с помощью AppiumDriver.GetScreenshot() и сравнивают его с эталонным снимком экрана в разных ориентациях и так далее.
различия должны быть обнаружены и помечены в выходном изображении (например, Differential.png) и показаны каждое различие в красном прямоугольнике или около того.
Я попробовал это с помощью OpenCvSharp с следующий код ниже. Но мне все еще интересно, есть ли лучшие доступные библиотеки, которые по-прежнему бесплатны и выполняют эту работу. Я посмотрел GroupDocs.Comparison, который, по крайней мере, было легко реализовать, но тоже не бесплатно.
Во всяком случае, я попробовал следующее:
using OpenCvSharp;
using OpenQA.Selenium.Appium;
namespace UITests.Android
{
public class AndroidTests : AndroidTestBase
{
[Fact]
public void AndroidSampleTest()
{
CompareImages(App, "D:\\TestScreenshots\\ScreenshotReference.png", "D:\\TestScreenshots\\ScreenshotDifferences.png");
}
public void CompareImages(AppiumDriver driver, string referenceImagePath, string outputDifferencePath)
{
// 1. Take a Screenshot
string screenshotPath = CaptureScreenshot(driver, "D:\\TestScreenshots\\ScreenshotCurrent.png");
// 2. Load image
Mat referenceImage = Cv2.ImRead(referenceImagePath, ImreadModes.Color);
Mat currentImage = Cv2.ImRead(screenshotPath, ImreadModes.Color);
if (referenceImage.Empty() || currentImage.Empty())
{
throw new Exception("One of the Images could not be loaded.");
}
// 3. Scale images to same size if necessary
if (referenceImage.Size() != currentImage.Size())
{
Cv2.Resize(currentImage, currentImage, referenceImage.Size());
}
// 4. Calculate Differences
Mat diff = new Mat();
Cv2.Absdiff(referenceImage, currentImage, diff);
// 5. Bring out differences (detailled processing)
Mat diffGray = new Mat();
Cv2.CvtColor(diff, diffGray, ColorConversionCodes.BGR2GRAY);
Cv2.Threshold(diffGray, diffGray, 20, 255, ThresholdTypes.Binary); // Threshold for differences
Cv2.Dilate(diffGray, diffGray, null, iterations: 2); // Bring out the differences
// 6. Identify Rows that are in the Android Emulator blue to ignore this header
List blueStartingRows = new List();
for (int i = 0; i < currentImage.Rows; i++)
{
Vec3b firstPixel = currentImage.At(i, 0);
// Android Blue (R, G, B)
if (firstPixel.Item0 == 152 && firstPixel.Item1 == 11 && firstPixel.Item2 == 43)
{
blueStartingRows.Add(i);
}
else
{
break;
}
}
// 7. Ignore the Rows for the Android Emulator Header
for (int i = 0; i < blueStartingRows.Count; i++)
{
diffGray.Row(blueStartingRows[i]).SetTo(Scalar.All(0)); // Setze die obere Region auf Schwarz (ignoriert Unterschiede)
}
// 8. Find Contours
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(diffGray, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 9. Red rectangle for the differences
foreach (var contour in contours)
{
Rect rect = Cv2.BoundingRect(contour);
// Only makr greatest differences
if (rect.Width > 10 && rect.Height > 10) // Mindestgröße
{
Cv2.Rectangle(currentImage, rect, Scalar.Red, 2); // Rote Rechtecke zeichnen
}
}
// 10. Same image with differences
Cv2.ImWrite(outputDifferencePath, currentImage);
}
private string CaptureScreenshot(AppiumDriver driver, string screenshotPath)
{
Task.Delay(1000);
// Capture Screenshot with Appium
var screenshot = driver.GetScreenshot();
// Save Screenshot
File.WriteAllBytes(screenshotPath, screenshot.AsByteArray);
return screenshotPath;
}
}
}
Вопросы:
Существуют ли лучшие библиотеки ( все еще бесплатен), который можно настроить проще и прозрачнее.
Поскольку я также хочу обнаружить цветовые различия, действительно ли хорошей идеей будет выполнить преобразование в Cv2.CvtColor(diff, diffGray, ColorConversionCodes.BGR2GRAY);? (упоминалось, что для обнаружения контуров это будет лучше, но я не знаю, правильно ли это работает)
Я до сих пор не могу сказать, правильно ли работает описанный выше метод, особенно когда Я хочу обнаружить множество различий внутри других (например, когда есть различия в цвете света во всех буквах «а», например, которые очень близки, поскольку Gray100 был изменен на Gray50 или другие различия в типах света)< /li>
В общем, вопрос в том, порекомендуете ли вы что-нибудь получше...
[img]https://i. sstatic.net/ZLtILmSb.png[/img]
У меня есть приложение .NET MAUI, для которого я хочу написать несколько тестов Appium. Раньше у меня были проблемы с изменениями, внесенными в новую версию .NET MAUI, когда макеты ломались и выходили за пределы доступного экрана, а кнопки обрезались и т. д. p> Поэтому я решил, что мне также нужны тесты, которые захватывают снимок экрана с помощью AppiumDriver.GetScreenshot() и сравнивают его с эталонным снимком экрана в разных ориентациях и так далее. различия должны быть обнаружены и помечены в выходном изображении (например, Differential.png) и показаны каждое различие в красном прямоугольнике или около того. Я попробовал это с помощью OpenCvSharp с следующий код ниже. [b]Но[/b] мне все еще интересно, есть ли лучшие доступные библиотеки, которые по-прежнему бесплатны и выполняют эту работу. Я посмотрел GroupDocs.Comparison, который, по крайней мере, было легко реализовать, но тоже не бесплатно. Во всяком случае, я попробовал следующее: [code]using OpenCvSharp; using OpenQA.Selenium.Appium;
namespace UITests.Android { public class AndroidTests : AndroidTestBase { [Fact] public void AndroidSampleTest() { CompareImages(App, "D:\\TestScreenshots\\ScreenshotReference.png", "D:\\TestScreenshots\\ScreenshotDifferences.png"); }
public void CompareImages(AppiumDriver driver, string referenceImagePath, string outputDifferencePath) { // 1. Take a Screenshot string screenshotPath = CaptureScreenshot(driver, "D:\\TestScreenshots\\ScreenshotCurrent.png");
// 2. Load image Mat referenceImage = Cv2.ImRead(referenceImagePath, ImreadModes.Color); Mat currentImage = Cv2.ImRead(screenshotPath, ImreadModes.Color);
if (referenceImage.Empty() || currentImage.Empty()) { throw new Exception("One of the Images could not be loaded."); }
// 3. Scale images to same size if necessary if (referenceImage.Size() != currentImage.Size()) { Cv2.Resize(currentImage, currentImage, referenceImage.Size()); }
// 4. Calculate Differences Mat diff = new Mat(); Cv2.Absdiff(referenceImage, currentImage, diff);
// 5. Bring out differences (detailled processing) Mat diffGray = new Mat(); Cv2.CvtColor(diff, diffGray, ColorConversionCodes.BGR2GRAY); Cv2.Threshold(diffGray, diffGray, 20, 255, ThresholdTypes.Binary); // Threshold for differences Cv2.Dilate(diffGray, diffGray, null, iterations: 2); // Bring out the differences
// 6. Identify Rows that are in the Android Emulator blue to ignore this header List blueStartingRows = new List(); for (int i = 0; i < currentImage.Rows; i++) { Vec3b firstPixel = currentImage.At(i, 0);
// Android Blue (R, G, B) if (firstPixel.Item0 == 152 && firstPixel.Item1 == 11 && firstPixel.Item2 == 43) { blueStartingRows.Add(i); } else { break; } }
// 7. Ignore the Rows for the Android Emulator Header for (int i = 0; i < blueStartingRows.Count; i++) { diffGray.Row(blueStartingRows[i]).SetTo(Scalar.All(0)); // Setze die obere Region auf Schwarz (ignoriert Unterschiede) }
// 8. Find Contours Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(diffGray, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 9. Red rectangle for the differences foreach (var contour in contours) { Rect rect = Cv2.BoundingRect(contour);
// Capture Screenshot with Appium var screenshot = driver.GetScreenshot();
// Save Screenshot File.WriteAllBytes(screenshotPath, screenshot.AsByteArray);
return screenshotPath; } } } [/code] [b]Вопросы[/b]: [list] [*]Существуют ли [b]лучшие библиотеки[/b] ( все еще бесплатен), который можно настроить проще и прозрачнее. [*]Поскольку я также хочу обнаружить [b]цветовые различия[/b], действительно ли хорошей идеей будет выполнить преобразование в Cv2.CvtColor(diff, diffGray, ColorConversionCodes.BGR2GRAY);? (упоминалось, что для обнаружения контуров это будет лучше, но я не знаю, правильно ли это работает) Я до сих пор не могу сказать, правильно ли работает описанный выше метод, особенно когда Я хочу обнаружить множество различий внутри других (например, когда есть различия в цвете света во всех буквах «а», например, которые очень близки, поскольку Gray100 был изменен на Gray50 или другие различия в типах света)< /li> [/list] В общем, вопрос в том, порекомендуете ли вы что-нибудь получше... [img]https://i. sstatic.net/ZLtILmSb.png[/img]