如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]

Posted

技术标签:

【中文标题】如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]【英文标题】:How to capture Screenshot in Selenium Webdriver using Java without Window being resized [duplicate] 【发布时间】:2012-06-12 09:50:23 【问题描述】:

我正在尝试在 selenium 运行时截取网页的屏幕截图。我为此目的使用以下代码

WebDriver augmentedDriver = new Augmenter().augment(seleniumDriver);
            File scrFile = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE);

现在它很好地满足了我的目的,只是每当调用此方法时,浏览器会自动进入默认大小并再次最大化。

每次调用屏幕截图函数时都会继续。 如果我不使用 selenium webdriver 截屏并使用其他 java 函数,我能够解决问题。

我想知道是否有人有类似的问题/我为什么会遇到这个问题。有什么解决方法吗?

【问题讨论】:

***.com/questions/3422262/… 【参考方案1】:
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

FileUtils.copyFile(scrFile, new File("D:\\screenshot.jpg"));

这段代码肯定有帮助

【讨论】:

【参考方案2】:

它会尝试适应页面大小并将屏幕截图尽可能小或尽可能大以适应整个页面。除了烦人之外,它不应该是任何其他问题的原因,因此被认为是比只截取实际视口的屏幕截图更好的解决方案,因为实际视口可能会丢失您尝试检查的页面的一些重要部分。

如果您对此不满意,请使用Robot 及其createScreenCapture() 方法。


或者,但它只适用于 Firefox,您可以尝试覆盖 FirefoxDriver's 截屏方法。未经测试,不知道你是否会被允许这样做。

javascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("FirefoxDriver.prototype.screenshot = function(a);");

而且(如果这还不够的话)甚至可能

js.executeScript("FirefoxDriver.prototype.saveScreenshot = function(a,b);");

从here 推断。实际截图代码为here。您可以将 FirefoxDriver.prototype.screenshot 函数替换为您自己的函数,该函数不会采用 heightwidth 的最大可滚动值...

【讨论】:

我确实尝试了 Robot CreateScreenCapture() 方法,现在它似乎是我唯一的选择。因为自适应调整大小导致我的其他方法出现问题。 我对这个很感兴趣。为什么调整大小对您很重要,它会破坏什么? @RabimbaKaranjai 另外,我用一个可能的新解决方案编辑了答案,阻止 FF 截取屏幕截图。您可以查看 screenshooter.js 来制作一个不会调整窗口大小的新屏幕截图脚本(重构 widthheight 的用法)。 我主要使用 IE 来运行测试。所以我应该将 Firefox 驱动程序更改为 selenium webdriver。会试试这个 是的,IE 的截图逻辑隐藏了here。这是一个 C++ 文件,您可以将您的 IEDriver.dll 版本提供给 Selenium ...我只是认为这不值得。【参考方案3】:

截屏代码使用了 TakesScreenshot 接口的 getScreenshotAs 方法。以下代码将截取 webDriver 实例打开的网页。

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("D:\\testScreenShot.jpg"));

现在为了在测试失败的情况下截屏,我们将使用 TestNG 的 AfterMethod 注释。在 AfterMethod 注释中,我们将使用 ITestResult 接口的 getStatus() 方法返回测试结果,如果失败,我们可以使用上述命令进行截图。代码 sn-p 对测试失败进行截图-

@AfterMethod
public void takeScreenShotOnFailure(ITestResult testResult) throws IOException 
    if (testResult.getStatus() == ITestResult.FAILURE) 
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File("D:\\testScreenShot.jpg"));
           

完整的示例脚本参考http://artoftesting.com/automationTesting/screenShotInSelenium.html

【讨论】:

【参考方案4】:

我为此创建了一个方法,它非常易于使用。它截取整个网页的屏幕截图。它根据屏幕截图的数量对屏幕截图进行计数和命名,该方法还将屏幕截图作为 .png 文件存储到 src 中。

public static void screenshot(WebDriver driver) 


    System.out.println("Taking the screenshot.");   
    console_logs("Taking the screenshot.");
    scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    try 
        FileUtils.copyFile(scrFile, new File("src//tempOutput//webPage_screenshot_"+count+".png"));
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    
    count++;
    //return scrFile;

使用方法:

screenshot(driver);

【讨论】:

以上是关于如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不缩放其内容的情况下调整 opengl 视口大小

如何在不模糊或使用毕加索的情况下调整图像大小

在不调整 cypress 视口大小的情况下捕获元素的屏幕截图

python如何在不损失质量的情况下调整(缩小)图像的大小

使用 Python - 如何在不超过原始图像大小的情况下调整裁剪图像的大小以满足纵横比

如何在不调整大小的情况下旋转 UITextView?