在测试移动设备尺寸时,Chrome只会截取可见窗口的屏幕截图。我认为这是标准行为和预期行为。但是,我还想捕获页面的整个滚动高度,以便检查整个页面的呈现。
我认为最简单的解决方案是将Chrome窗口高度设置为足够大的值,然后完成工作。但是,Chrome窗口的高度似乎受我的物理屏幕高度(即。我使用将它设置为5,000 browser.manage().window().setSize(375,5000);,但它的大小只能调整为1,200的高度。
browser.manage().window().setSize(375,5000);
我已经知道[根据WebDriver规范] [1],[ takeScreenshot()功能] [2] 不应捕获整个页面 ,而应仅对可见区域进行截图。
takeScreenshot()
操作编辑:我选择了最后一个选项,在下面的选项中,我将其标记为“ 工作解决方案! ”
下面是解决问题的按类型分类的不同策略。
在CrossBrowserTesting.com上引用屏幕截图系统的作者:
作为CrossBrowserTesting.com的屏幕截图系统的作者,我可以告诉您,我们能够在浏览器中一致且可靠地获取全屏屏幕截图的唯一方法是 滚动,捕获和追加图像 。
这里是一个示例工作实现示例,以cnn.com目标示例为例,滚动并获取可见区域的屏幕截图。使用scrollHeight,clientHeight并scrollTop确定在何处,我们都在一个垂直滚动位置以及如何更向下滚动。由于我们正在循环处理promise,因此必须使用“我们处于最底层”的基本条件来创建递归函数:
cnn.com
scrollHeight
clientHeight
scrollTop
var fs = require('fs'), Utils = { screenShotDirectory: '', writeScreenShot: function (data, filename) { var stream = fs.createWriteStream(this.screenShotDirectory + filename); stream.write(new Buffer(data, 'base64')); stream.end(); }, getSizes: function () { return browser.executeScript("return {scrollHeight: document.body.scrollHeight, clientHeight: document.body.clientHeight, scrollTop: document.body.scrollTop};"); }, scrollToBottom: function (height, index) { var self = this; self.getSizes().then(function (data) { // continue only if we are not at the bottom of the page if (data.scrollTop + data.clientHeight < data.scrollHeight) { browser.executeScript("window.scrollTo(0, arguments[0]);", height).then(function () { browser.takeScreenshot().then(function (png) { self.writeScreenShot(png, "test" + index + ".png"); }); }); self.scrollToBottom(height + data.clientHeight, index + 1); } }); } }; describe("Scrolling and saving screenshots", function () { beforeEach(function () { browser.ignoreSynchronization = true; browser.get("http://www.cnn.com/"); }); it("should capture an entire page", function () { Utils.getSizes().then(function (data) { Utils.scrollToBottom(data.clientHeight * 2, 1); }); }); });
它将产生多个test<index>.png图像,然后可以将它们粘合在一起。
test<index>.png
要在“单列图像”中合并图像,例如,您可以GraphicsMagick通过gmnodejs模块使用图像处理系统。模式中带有选项的.montage()方法 会有所帮助。样例代码:concatenate``1x
GraphicsMagick
gm
.montage()
concatenate``1x
var gm = require('gm'); Utils.getSizes().then(function (data) { var index = Utils.scrollToBottom(data.clientHeight * 2, 1); var op = gm(); for (var i = 1; i <= index; i++) { op = op.in("test" + i + ".png"); } op = op.montage().mode("concatenate").tile("1x"); op.write('output.png', function (err) { if (err) console.log(err); }); });
在Chrome中,您始终只会在结果屏幕截图上看到可见区域,这是相关chromedriver问题,其中包含有关该问题的大量信息以及多种解决方法:
chromedriver
出乎意料的是,它虽然应该在Firefox中也可以工作 -如果可能,请切换到它:
占据整个屏幕的Chrome屏幕截图与Firefox的不同。Firefox将捕获整个屏幕,甚至包括当前不可见的部分屏幕。Chrome不会!
另一个选择是使用诸如的服务,BrowserStack或SauceLabs在特定的浏览器中的特定平台上启动测试,并使用 足够大 的 特定分辨率 。量角器支持Sauce Labs和BrowserStack开箱即用。
BrowserStack
SauceLabs
Sauce Labs
BrowserStack的示例配置:
exports.config: { browserstackUser: "user", browserstackKey: "key", capabilities: { 'browserstack.local': true, 'browserstack.debug': true, browserName: "Chrome", os: "Windows", os_version: "8", resolution: "2048x1536" }, }
然后, 最大化浏览器窗口 (onPrepare()例如inside ):
onPrepare()
browser.driver.manage().window().maximize();
并截图。
工作解决方案!!!
另一种选择是在虚拟显示器中运行测试。我将遵循此博客文章并使用Xvfb,当您运行Xvfb服务器时,可以指定分辨率:
Xvfb
/usr/bin/Xvfb :99 -ac -screen 0 2048x6000x24 &
另请参阅以下主题的相关信息:
您也可以使用允许配置屏幕尺寸的docker-selenium解决方案。
docker-selenium