Skip to main content
 首页 » 编程设计

c#之如何在 C# 中修复 "Clone.Bitmap"系统内存不足

2024年02月25日28cmt

<分区>

在 VS Code 上,我想通过获取应用程序的屏幕截图元素在应用程序的视觉对象上设置 UI 测试。但是,当“按钮”等元素在页面上不可见时,您需要向下滚动才能看到它,在创建屏幕截图时,会显示“系统内存不足”错误。

这是 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(); 
            }