如何在 C# 中修复 "Clone.Bitmap" 系统内存不足
How to fix "Clone.Bitmap" system out of memory in C#
在 VS Code 上,我想通过获取应用的屏幕截图元素在应用的视觉上设置 UI 测试。但是,当 "button" 等元素在您需要向下滚动才能看到的页面上不可见时,创建屏幕截图时会显示 "system out of memory" 错误。
这是 c# 中的代码摘录。
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);
}
有关 Dispose 的更多详细信息:
我正在尝试,但我认为我用错了方法。 using应该怎么用?我可以举个例子吗?
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();
}
Bitmap
class 持有 非托管资源 与 操作系统 需要 发布。创建位图后,您需要处理所有位图。
您创建或克隆的任何位图都需要处理(在您完成它们之后)。我建议查看 using
statement
Provides a convenient syntax that ensures the correct use of
IDisposable objects.
在 VS Code 上,我想通过获取应用的屏幕截图元素在应用的视觉上设置 UI 测试。但是,当 "button" 等元素在您需要向下滚动才能看到的页面上不可见时,创建屏幕截图时会显示 "system out of memory" 错误。
这是 c# 中的代码摘录。
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);
}
有关 Dispose 的更多详细信息:
我正在尝试,但我认为我用错了方法。 using应该怎么用?我可以举个例子吗?
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();
}
Bitmap
class 持有 非托管资源 与 操作系统 需要 发布。创建位图后,您需要处理所有位图。
您创建或克隆的任何位图都需要处理(在您完成它们之后)。我建议查看 using
statement
Provides a convenient syntax that ensures the correct use of IDisposable objects.