如何在 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.