如何让 Selenium firefox 驱动只截取浏览过的页面

Posted

技术标签:

【中文标题】如何让 Selenium firefox 驱动只截取浏览过的页面【英文标题】:How to make Selenium firefox driver take screenshots of only viewed page 【发布时间】:2016-01-05 17:58:18 【问题描述】:

我正在使用 Java 中的 Selenium 运行一系列自动化 GUI 测试。这些测试经常使用以下方法截取屏幕截图:

    public static void takeScreenshot(String screenshotPathAndName, WebDriver driver) 
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try 
            FileUtils.copyFile(scrFile, new File(screenshotPathAndName));
         catch(Exception e) 
            e.printStackTrace();
        
    

这在 Chrome 和 IE 中运行良好,但在 Firefox 中,我不断在屏幕截图下获得大片空白。我怀疑空白实际上是页面本身的一部分,但通常在浏览器中隐藏(滚动条在空白之前停止)。我做了一个快速测试

    driver.get("http://***.com/");
    takeScreenshot("D:\\TestRuns\\***.png", driver);

发现使用 Firefox 驱动时,屏幕截图中会捕获整个页面,而使用 Chrome 驱动时,只会捕获浏览器中显示的内容。

有什么方法可以强制 Firefox 驱动程序截取屏幕截图,其中只包含浏览器中实际可以看到的内容(实际用户会看到的内容)?

【问题讨论】:

【参考方案1】:

根据this question 的回答,我能够添加 4 行代码来将图像裁剪为浏览器大小。这确实解决了我的问题,尽管如果可以通过驱动程序解决而不是在截屏后进行裁剪会更好。

public static void takeScreenshot(String screenshotPathAndName, WebDriver driver) 
    File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    try 

        int height = driver.manage().window().getSize().getHeight();
        BufferedImage img = ImageIO.read(scrFile);
        BufferedImage dest = img.getSubimage(0, 0, img.getWidth(), height);
        ImageIO.write(dest, "png", scrFile);

        FileUtils.copyFile(scrFile, new File(screenshotPathAndName));
     catch(Exception e) 
        e.printStackTrace();
    

【讨论】:

【参考方案2】:

试试这个:

private static void snapshotBrowser(TakesScreenshot driver, String screenSnapshotName, File browserFile) 
        try 

            File scrFile = driver.getScreenshotAs(OutputType.FILE);
            log.info("PNG browser snapshot file name: \"\"", browserFile.toURI().toString());

            FileUtils.deleteQuietly(browserFile);
            FileUtils.moveFile(scrFile, browserFile);
         catch (Exception e) 
            log.error("Could not create browser snapshot: " + screenSnapshotName, e);
        
    

【讨论】:

没用。仍然获得显示整个页面的屏幕截图,而不仅仅是在浏览器中看到的内容。

以上是关于如何让 Selenium firefox 驱动只截取浏览过的页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Selenium Webdriver 3 中为 Firefox 驱动程序设置默认配置文件?

Selenium怎样驱动Firefox浏览器

pycharm selenium 安装firefox驱动和Google驱动教程

谁说selenium打开firefox不用驱动的???!!!!

Selenium-Firefox驱动程序问题(Firefox驱动程序无法解析为[重复]类型

selenium怎么使用firefox