C#调用JS实现滚动截屏-页面和页面元素通用

来源:互联网 发布:失业金数据是什么 编辑:程序博客网 时间:2024/06/06 13:59


/// <summary>
        /// 滚动的方式截取页面中指定的元素如:Div的整个元素截屏
        /// </summary>
        /// <param name="ngdriver"></param>
        /// <param name="JS_Element">指定需要截屏的元素,例如:document.getElementsByClassName('gridster dashboard-main ready')[0]</param>
        /// <returns></returns>
        public static Bitmap TakeTotalElementScreenshot(NgWebDriver ngdriver, string JS_Element)
        {

            Bitmap ImageBmp = null;
            try
            {
                //获取指定控件/元素的整体高度和宽度
                int totalWidth = Convert.ToInt32(((IJavaScriptExecutor)ngdriver.WrappedDriver).ExecuteScript("var e=" + JS_Element + ";return e.scrollWidth").ToString());
                int totalHeight = Convert.ToInt32(((IJavaScriptExecutor)ngdriver.WrappedDriver).ExecuteScript("var e=" + JS_Element + ";return e.scrollHeight").ToString());

                // 获取指定控件/元素在可视的窗口高度和宽度
                int viewWidth = Convert.ToInt32(((IJavaScriptExecutor)ngdriver).ExecuteScript("var e=" + JS_Element + ";return e.clientWidth").ToString());
                int viewHeight = Convert.ToInt32(((IJavaScriptExecutor)ngdriver).ExecuteScript("var e=" + JS_Element + ";return e.clientHeight").ToString());

                List<Rectangle> rectangleList = new List<Rectangle>();

                // 高度处理:循环滚动直到达到页面底部
                for (int i = 0; i < totalHeight; i += viewHeight)
                {
                    int newHeight = viewHeight;
                    // 最后一个区域的处理
                    if (i + viewHeight > totalHeight)
                    {
                        newHeight = totalHeight - i;
                    }
                    // 宽度处理:循环滚动直到达到页面最右侧
                    for (int ii = 0; ii < totalWidth; ii += viewWidth)
                    {
                        int newWidth = viewWidth;
                        //最后一个区域的处理
                        if (ii + viewWidth > totalWidth)
                        {
                            newWidth = totalWidth - ii;
                        }

                        // 创建局部区域
                        Rectangle currRect = new Rectangle(ii, i, newWidth, newHeight);
                        rectangleList.Add(currRect);
                    }
                }

                // 拼接图片
                ImageBmp = new Bitmap(totalWidth, totalHeight);
                //获取所有区域然后拼接成一个整体图片
                Rectangle previous = Rectangle.Empty;
                foreach (var rectangle in rectangleList)
                {
                    if (previous != Rectangle.Empty)
                    {
                        int xDiff = rectangle.Right - previous.Right;
                        int yDiff = rectangle.Bottom - previous.Bottom;
                        //滚动滚动条,View下一区域
                        ((IJavaScriptExecutor)ngdriver).ExecuteScript(String.Format("var e=" + JS_Element + "; e.scrollBy({0}, {1})", xDiff, yDiff));
                        System.Threading.Thread.Sleep(500);
                    }

                    // 执行截屏
                    var screenshot = ((ITakesScreenshot)ngdriver.WrappedDriver).GetScreenshot();

                    Image screenshotImage;
                    using (MemoryStream memStream = new MemoryStream(screenshot.AsByteArray))
                    {
                        screenshotImage = Image.FromStream(memStream);
                    }
                    Rectangle sourceRectangle = new Rectangle(viewWidth - rectangle.Width, viewHeight - rectangle.Height, rectangle.Width, rectangle.Height);
                    using (Graphics gph = Graphics.FromImage(ImageBmp))
                    {
                        gph.DrawImage(screenshotImage, rectangle, sourceRectangle, GraphicsUnit.Pixel);
                    }
                    previous = rectangle;
                }
            }
            catch { }
            return ImageBmp;
        }

原创粉丝点击