此问题是another question I asked的一部分。但是,我已经找到了这个部分的答案,并认为它对其他人也有用。 我的另一个问题的一部分:
我正在使用黄瓜与黄瓜结合进行自动屏幕测试,并希望在我的宁静报告中包含整页截图。报告中的屏幕截图通常只是视口的捕获。但是,这通常不能提供足够的信息,因为这只是屏幕的一部分。
我发现抓取宁静截图是驱动程序实现的一部分。由于大多数驱动程序符合屏幕截图的W3C定义,因此这些驱动程序仅捕获当前视口。
答案 0 :(得分:3)
tl; dr:使用FirefoxDriver
我联系了W3C的David Burns。他非常乐于助人,他的回答为我清理了很多。
首先,FirefoxDriver现在仍然会截取整页的截图。大卫说:
另一方面,FirefoxDriver(以及Marionette的W3C webdriver实现)通过将Document转储到画布并在Canvas上调用Firefox特定的API来获取屏幕截图来进行屏幕截图。由于我们转储整个文档,我们可以执行整页截图。然而,当我们开始将更多的Servo代码放入Firefox以及我们访问屏幕截图更改的方式时,这可能会改变。
所以不幸的是,这可能会在将来发生变化,但现在它很好(当你使用FFdriver时)..
他还解释了为什么做出这样的选择以及他所提出的关于网页呈现如何运作的讨论的参考。 在我们的对话中,他还参考了有关如何捕获屏幕截图的讨论的minutes。
他的完整答案:
您好
tl; dr;因为并非所有浏览器都有创建整个页面截图的信息,所以全屏拍摄真的很难。 长版:
今年在Selenium Conf上我做了一个talk关于#isDisplayed有时会对你说谎的原因和屏幕截图相同的原因。为了使浏览器看起来尽可能快地加载网页,他们需要在视口中进行渲染,然后通过在CPU或GPU上进行计算来渲染它。 由于这种方法,它意味着浏览器构建某些区域的显示列表并创建要渲染的“图块”。它从视口开始并运行。现在,浏览器不会一次呈现整个页面,当您滚动时,它会在上下准备好几次,并在滚动时计算其余部分。
现在,ChromeDriver和微软的EdgeDriver都会从显示列表中截取屏幕截图,并拥有只为其提供视口的内部API。这是因为他们的参考测试(或供应商已知的重新测试)只关心这一点。由于边缘情况,他们都觉得不值得做其余的努力。
另一方面,FirefoxDriver(以及Marionette的W3C webdriver实现)通过将Document转储到画布并在Canvas上调用Firefox特定的API来获取屏幕截图来进行屏幕截图。由于我们转储整个文档,我们可以执行整页截图。然而,当我们开始将更多的Servo代码放入Firefox以及我们访问屏幕截图更改的方式时,这可能会改变。因为我们只知道它导致我们的视口信息,然后必须将图像拼接在一起以获得整页截图。 ChromeDriver和IEDriver都这样做,两个开发团队都认为这是一个丑陋的黑客攻击,因为它并不总是正确的,他们无法做很多事情来做正确的事。
我希望这有助于解释它。我建议观看我的talk,因为我解释了渲染器和布局引擎在浏览器中的工作原理。
大卫