这个问题是我提出的另一个问题的一部分。但是,我已经找到了这部分的答案,并认为这对其他人也将是有用的。我其他问题的一部分:
我正在结合使用Serenity和黄瓜来进行自动屏幕测试,并希望在我的Serenity报告中包括整页的屏幕截图。报告中的屏幕截图通常只是视口的捕获。但是,通常这并不能提供足够的信息,因为这只是屏幕的一部分。
我发现捕获宁静屏幕快照是驱动程序实现的一部分。由于大多数驱动程序都符合屏幕快照的W3C定义,因此这些驱动程序仅捕获当前视口。
tl; dr:使用FirefoxDriver
我联系了W3C的David Burns。他非常乐于助人,他的回答为我澄清了很多。
首先,FirefoxDriver现在仍会拍摄整个页面的屏幕截图。大卫说:
另一方面,FirefoxDriver(以及在Marionette中,我们的W3C
webdriver实现)通过将文档转储到画布中并在Canvas上调用Firefox特定的API来获取屏幕截图来进行屏幕截图。由于我们转储了整个文档,因此我们可以进行全屏截图。但是,当我们开始将更多Servo代码添加到Firefox中以及访问屏幕截图的方式发生变化时,这种情况可能会改变。
因此,不幸的是,这种情况将来可能会改变,但是就目前而言,这很好(使用FFdriver时)。
他还解释了为何做出此选择,并引用了他关于网页渲染工作方式的演讲。后来在我们的谈话中,他还引用到分钟的讨论关于截图应该如何被捕获。
他的完整答案是:
你好
tl; dr; 全屏拍摄非常困难,因为并非所有浏览器都具有创建整个页面的屏幕截图的信息。长版:
在今年的Selenium
Conf上,我谈到了#isDisplayed有时会骗你的原因,原因与屏幕截图相同。为了使浏览器看起来像使网页尽可能快地加载,它们通过在CPU或GPU上进行计算来锻炼需要在视口中呈现的内容,然后呈现该内容。由于这种方法,这意味着浏览器会建立某些区域的显示列表,并创建要显示的“平铺”。它从视口开始,然后开始工作。现在,浏览器不会一次渲染整个页面,它将在滚动时上下左右准备好几次,并在滚动时计算剩余时间。现在,ChromeDriver和Microsoft的EdgeDriver都从显示列表中进行屏幕截图,并具有仅向其提供视口的内部API。这是因为他们的参考测试(或供应商所知的reftest)仅在乎这一点。由于边缘情况,他们俩都不觉得为剩下的事情付出努力是不值得的。
另一方面,FirefoxDriver(以及在Marionette中,我们的W3C
webdriver实现)通过将文档转储到画布中并在Canvas上调用Firefox特定的API来获取屏幕截图来进行屏幕截图。由于我们转储了整个文档,因此我们可以进行全屏截图。但是,当我们开始将更多Servo代码添加到Firefox中以及访问屏幕截图的方式发生变化时,这种情况可能会改变。因为我们只知道视口信息,所以这导致我们不得不将图像缝合在一起以获得完整的页面截图。ChromeDriver和IEDriver都这样做,并且两个开发团队都认为这是一个丑陋的hack,因为它并不总是正确的,而且他们也无能为力。
我希望这会有所帮助并能很好地解释它。在解释渲染和布局引擎如何在浏览器中工作时,建议观看我的演讲。
大卫
我在浏览器栈上使用Selenium网络驱动程序自动测试,当我在Firefox和IE上截图时,它会截图整个页面。但是由于我的页面包含一个很长的列表——屏幕截图太长了,因此它不是一个清晰的图像,很难看出页面的行为是否正确。我需要它像Chrome一样精确:仅显示视口宽度和高度的屏幕截图。在Firefox和IE上可能吗? 我使用的代码:
问题内容: 目前,我正在以这种方式拍摄测试失败的屏幕截图: 我可以将自己的屏幕截图包含在TestNG报告链接或图片中吗?如果是,怎么办? 我在网上发现的只是FEST框架。但是由于我已经在截屏了,所以我不想使用其他框架。 问题答案: 是的,您可以在testng报告中包含指向屏幕截图的链接。 您需要通过使用@Listeners({yourListener.class})注释您的测试类或所有测试类的父级
问题内容: 目前,我正在以这种方式拍摄测试失败的屏幕截图: 我可以将自己的屏幕截图包含在TestNG报告链接或图片中吗?如果是,怎么办? 我在网上发现的只是FEST框架。但是由于我已经在截屏了,所以我不想使用其他框架。 问题答案: 是的,您可以在testng报告中包含指向屏幕截图的链接。 您需要调用方法以通过@Listeners({yourListener.class})注释您的测试类或所有测试类
我看到有人为此发了一篇帖子,在用JAVA和Cucumber进行测试的每一步之后,如何捕捉屏幕截图? 但是,我想做的是能够在每一个动作之后,甚至在一个Cucumber步骤内,拍摄一个屏幕截图,并将其嵌入Cucumber报告中。换句话说,在一个步骤中有多个动作可以满足这个步骤,我想为所有动作嵌入屏幕截图。这可能吗?如果是,怎么做?
目前,我正在尝试使用SeleniumWebDriver捕获一个屏幕截图。但我只能获得整个页面的屏幕截图。然而,我想要的只是捕获页面的一部分,或者基于ID或任何特定元素定位器捕获特定元素。(例如,我希望用image id=“Butterfly”捕捉图片) 有没有办法按所选项目或元素捕获屏幕截图?
我无法看到截图被捕获在cucumber的程度报告。 我已经调试并观察到代码已经执行,但屏幕截图并没有保存在extent report或html report文件中。 截图代码 if(scenario.isFailed()){byte[]screenshot=seleniumitls.captureShot();scenario.public void screenshot(scenario sce