private async void FullpageScreenshotByScrolling() { int scrollHeight = GetDocHeight(); if (scrollHeight == 0) { FireScreenshotCompleteEvent(false); return; } Debug.WriteLine("Client rect height: " + ClientRectangle.Size.Height); Debug.WriteLine("Control height: " + Height); Debug.WriteLine("Display Rect height: " + DisplayRectangle.Height); Debug.WriteLine("Client size height: " + ClientSize.Height); Enabled = false; int viewportHeight = ClientRectangle.Size.Height; int viewportWidth = ClientRectangle.Size.Width; await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { document.documentElement.style.overflow = 'hidden'; })();"); int count = 0; int pageLeft = scrollHeight; bool atBottom = false; Debug.WriteLine($"OUTSIDE --- PAGE LEFT: {pageLeft}. VIEWPORT HEIGHT: {viewportHeight}"); ImageDiskCache cache = new ImageDiskCache(); while (!atBottom) { if (pageLeft > viewportHeight) { await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { window.scroll(0," + (count * viewportHeight) + "); })();"); count++; await PutTaskDelay(); //we do need these delays. Some pages, like facebook, may need to load viewport content. using (Bitmap image = GetCurrentViewScreenshot()) { cache.AddImage(count, image); } if (!OsirtHelper.IsOnGoogle(URL)) { await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { var elements = document.querySelectorAll('*'); for (var i = 0; i < elements.length; i++) { var position = window.getComputedStyle(elements[i]).position; if (position === 'fixed') { elements[i].style.visibility = 'hidden'; } } })(); "); } } else { //find out what's left of the page to scroll, then take screenshot //if it's the last image, we're going to need to crop what we need, as it'll take //a capture of the entire viewport. await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { window.scrollBy(0," + pageLeft + "); })();"); atBottom = true; count++; await PutTaskDelay(); Rectangle cropRect = new Rectangle(new Point(0, viewportHeight - pageLeft), new Size(viewportWidth, pageLeft)); using (Bitmap src = GetCurrentViewScreenshot()) using (Bitmap target = new Bitmap(cropRect.Width, cropRect.Height)) using (Graphics g = Graphics.FromImage(target)) { g.DrawImage(src, new Rectangle(0, 0, target.Width, target.Height), cropRect, GraphicsUnit.Pixel); cache.AddImage(count, target); } } pageLeft = pageLeft - viewportHeight; Debug.WriteLine($"IN WHILE --- PAGE LEFT: {pageLeft}. VIEWPORT HEIGHT: {viewportHeight}"); }//end while await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { document.documentElement.style.overflow = 'auto'; })();"); await GetBrowser().MainFrame.EvaluateScriptAsync("javascript:var s = function() { document.body.scrollTop = document.documentElement.scrollTop = 0;}; s();"); if (!OsirtHelper.IsOnGoogle(URL)) { await GetBrowser().MainFrame.EvaluateScriptAsync("(function() { var elements = document.querySelectorAll('*'); for (var i = 0; i < elements.length; i++) { var position = window.getComputedStyle(elements[i]).position; if (position === 'fixed') { elements[i].style.visibility = 'visible'; } } })(); "); } Enabled = true; WaitWindow.Show(GetScreenshot, Resources.strings.CombineScreenshots); FireScreenshotCompleteEvent(true); }