有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Selenium/Java拍摄完整的页面截图

开箱即用,webdriver只获取可见页面区域的屏幕截图。 从this post开始,我想问一下,当页面长度大于视口时,如何使用Java在Selenium中拍摄完整的页面截图

描述如何做到这一点的帖子要么没有回答(比如this one),要么指向提供功能的AShot库(比如this one),但它有一些问题,这意味着我不想使用它。具体来说,当在例如Browserstack上使用远程驱动程序时,它只渲染屏幕截图的左半部分。此外,它不再由原作者维护,因此似乎更适合为本质上相当简单的问题编写新函数


共 (1) 个答案

  1. # 1 楼答案

    先决条件:访问WebDriver的实例。我的是用代码所在的类实例化的

    协调屏幕截图大小和向下滚动页面的主要功能如下。请注意,图像格式是为了使其与pdiff兼容:

    public void takeFullScreenshot(String outputFile) throws IOException {
    
    
            JavascriptExecutor js = ((JavascriptExecutor) webDriver);
    
            // Scroll right to the top
            js.executeScript("window.scrollTo(0,0)");
    
            // Get the height of the screen
            int windowHeight = ((Number) js.executeScript("return window.innerHeight")).intValue();
    
            // Get the total height of the page
            int pageHeight = ((Number) js.executeScript("return document.body.scrollHeight")).intValue();
    
            // Calculate the number of full screen shots
            double fullFraction = pageHeight / windowHeight;
            int fullShots = (int) fullFraction; // this simply removes the decimals
    
            // Initialise ouput image
            int imageWidth = webDriver.manage().window().getSize().width;
            BufferedImage fullScreenshot = new BufferedImage(imageWidth, pageHeight, BufferedImage.TYPE_4BYTE_ABGR);
    
            // Get the graphics
            Graphics2D fullGraphics = fullScreenshot.createGraphics();
    
            // Calculate our scroll script
            String script = "window.scrollBy(0," + String.valueOf(windowHeight) + ")";
    
            // Loop - for the required number of full screenshots
            for (int aShot = 0; aShot < fullShots; aShot ++) {
    
                // Sort out the screenshot and paste it in the correct place
                pasteScreenshot(fullGraphics, aShot * windowHeight);
    
                // scroll
                js.executeScript(script);
            }
    
            // Final phase - scroll to the bottom
            js.executeScript(script); // we know this goes too far down, but should be OK.
    
            // Take final screenshot and paste at the bottom
            pasteScreenshot(fullGraphics, pageHeight - windowHeight);
    
            // Save the whole thing to output file.
            ImageIO.write(fullScreenshot, "PNG", new File(outputFile));
        }
    

    将屏幕截图粘贴到输出图形中正确位置的小功能如下:

    private void pasteScreenshot (Graphics2D outputGraphics, int yCoordinate) throws IOException {
            // Take screenshot and hold it as an image
            File tmpFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
            BufferedImage tmpImage = ImageIO.read(tmpFile);
    
            // Draw it on the graphics of the final output image
            outputGraphics.drawImage(tmpImage, null, 0, yCoordinate);
    
        }
    

    希望这是有用的