В VS Code я хотел бы настроить тесты пользовательского интерфейса для визуального элемента приложения, взяв элементы скриншота приложения. Однако, когда элемент например «кнопка» не виден на странице, вам нужно прокрутить вниз, чтобы увидеть его, при создании снимка экрана отображается ошибка «недостаточно памяти системы».
Это фрагмент кода на С#.
public void TakeScreenshotOfElementCheckbox()
{
string fileName = @"C:\Users\...\testing\Screenshots\checkbox.png";
var screenshotDriver = driver as ITakesScreenshot;
Screenshot screenshot = screenshotDriver.GetScreenshot();
var bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray));
IWebElement element = driver.FindElement(By.XPath(".//*[@class='footer-convenant']"));
var cropArea = new Rectangle(element.Location, element.Size);
var bitmap = bmpScreen.Clone(cropArea, bmpScreen.PixelFormat);
bitmap.Save(fileName);
}
Подробнее об утилизации:
Я пытаюсь, но я думаю, что использую неправильный путь. использование следует использовать как? Можно пример?
string fileName = @"C:\Users\...\testing\Screenshots\Checkbox\checkbox.png";
using (var image = new Bitmap(fileName))
{
var screenshotDriver = driver as ITakesScreenshot;
Screenshot screenshot = screenshotDriver.GetScreenshot();
//Bitmap bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray));
// 2. Get screenshot of specific element
element = driver.FindElement(By.XPath(".//*[@class='Checkbox']"));
Rectangle rect = new Rectangle(element.Location, element.Size);
var bitmap = image.Clone(rect, image.PixelFormat);
bitmap.Save(fileName);
}
Я пытаюсь, но я думаю, что я не за горами. Можете ли вы показать мне структуру того, что это может быть?
string fileName = @"C:\Users\...\testing\Screenshots\Checkbox\checkbox.png";
using (var image = new Bitmap(fileName))
{
// 1. Make screenshot of all screen
var screenshotDriver = driver as ITakesScreenshot;
Screenshot screenshot = screenshotDriver.GetScreenshot();
Bitmap bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray));
// 2. Get screenshot of specific element
element = driver.FindElement(By.XPath(".//*[@class='Checkbox']"));
Rectangle rect = new Rectangle(element.Location, element.Size);
using (var bitmap = image.Clone(rect, image.PixelFormat))
{
bitmap.Save(fileName);
}
}
Или
string fileName = @"C:\Users\..\testing\Screenshots\Checkbox\checkbox.png";
using (var image = new Bitmap(fileName))
{
// 1. Make screenshot of all screen
var screenshotDriver = driver as ITakesScreenshot;
Screenshot screenshot = screenshotDriver.GetScreenshot();
Bitmap bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray));
// 2. Get screenshot of specific element
element = driver.FindElement(By.XPath(".//*[@class='Checkbox']"));
Rectangle rect = new Rectangle(element.Location, element.Size);
var bitmap = bmpScreen.Clone(rect, bmpScreen.PixelFormat);
bitmap.Save(fileName);
bitmap.Dispose();
}
Также подтвердите, что cropArea
действителен в соответствии с правилами docs.microsoft.com/en-us/dotnet/api/… . (т.е. проверьте значения element.Location
и element.Size
)
Привет, так что во второй попытке у вас есть 2 растровых изображения, вы удаляете первое, но не второе, которое должно быть удалено сразу после метода сохранения. Если это не сработает, я бы хотел увидеть объект снимка экрана.
@GioOps Смотрите мой первый комментарий. Вы Dispose
из обе ваших Bitmap
s?
На самом деле, но искренне я не понимаю, как настроить удаление с помощью
Класс Bitmap
содержит неуправляемые ресурсы с операционная система, который должен быть выпущенный. Вам нужно распоряжаться все ваши растровые изображения после их создания.
Любое созданное вами растровое изображение или клон необходимо удалить (после того, как вы закончите с ними). Предлагаю посмотреть на using
заявление
Provides a convenient syntax that ensures the correct use of IDisposable objects.
я использую try catch, и меня поймал bmpScreen.Dispose(). Ошибки не отображаются, но у меня нет скриншота.
Спасибо, Майкл Рэндалл. Это было действительно полезно для меня.
Обязательно
Dispose
из обе вашихBitmap
s.