Esempio n. 1
0
        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);
        }