如何在TestCafe中捕获带overflow:auto的滚动元素完整截图?
解决TestCafe捕获overflow:auto容器内可滚动元素完整截图的问题
针对你遇到的#sidebar-quicklinks这种在overflow:auto容器里的可滚动元素,TestCafe的takeElementScreenshot没有全屏选项的问题,给你几个靠谱的解决办法:
临时修改元素overflow属性,让元素完整展开
先通过TestCafe的ClientFunction获取目标元素,临时把它的overflow设为visible,让元素完整显示出来再截图,之后恢复原属性。这样不会影响录屏,只是临时修改DOM样式,截图完成后立刻还原。代码示例:import { ClientFunction } from 'testcafe'; const getSidebarElement = ClientFunction(() => document.getElementById('sidebar-quicklinks')); const setElementOverflow = ClientFunction((element, value) => { element.style.overflow = value; }); test.page("https://developer.mozilla.org/en-US/docs/Web/CSS/Viewport_concepts")( "捕获完整的sidebar-quicklinks截图", async (t) => { const sidebarEl = await getSidebarElement(); // 保存原overflow属性 const originalOverflow = await ClientFunction(() => sidebarEl.style.overflow)(); // 临时设置为visible,让元素完整展开 await setElementOverflow(sidebarEl, 'visible'); // 执行截图 await t.takeElementScreenshot("#sidebar-quicklinks", "pre_post/3.png", { includeMargins: true }); // 恢复原属性 await setElementOverflow(sidebarEl, originalOverflow); } );动态调整容器高度匹配滚动高度
同样用ClientFunction获取元素的scrollHeight(元素内容的完整高度),然后把容器的高度设为这个值,让内容全部显示后截图,之后恢复原高度。代码示例:import { ClientFunction } from 'testcafe'; const getSidebarScrollHeight = ClientFunction(() => document.getElementById('sidebar-quicklinks').scrollHeight); const setElementHeight = ClientFunction((height) => { document.getElementById('sidebar-quicklinks').style.height = `${height}px`; }); const getOriginalHeight = ClientFunction(() => document.getElementById('sidebar-quicklinks').style.height); test.page("https://developer.mozilla.org/en-US/docs/Web/CSS/Viewport_concepts")( "捕获完整的sidebar-quicklinks截图", async (t) => { const originalHeight = await getOriginalHeight(); const fullHeight = await getSidebarScrollHeight(); // 设置容器高度为内容完整高度 await setElementHeight(fullHeight); // 截图 await t.takeElementScreenshot("#sidebar-quicklinks", "pre_post/3.png", { includeMargins: true }); // 恢复原高度 await setElementHeight(originalHeight || 'auto'); } );临时调整窗口大小后恢复
如果你担心resizeWindow影响录屏,可以先保存当前窗口的宽高,调整到能容纳完整元素的尺寸,截图后立刻恢复原窗口大小,这样录屏只会短暂显示窗口调整,之后回到原状态,不会影响整体测试录屏的有效性。代码示例:test.page("https://developer.mozilla.org/en-US/docs/Web/CSS/Viewport_concepts")( "捕获完整的sidebar-quicklinks截图", async (t) => { // 保存当前窗口大小 const currentSize = await t.getWindowSize(); // 调整窗口到足够容纳元素的尺寸(比如1920x2000,根据元素实际高度调整) await t.resizeWindow(1920, 2000); // 截图 await t.takeElementScreenshot("#sidebar-quicklinks", "pre_post/3.png", { includeMargins: true }); // 恢复原窗口大小 await t.resizeWindow(currentSize.width, currentSize.height); } );
内容的提问来源于stack exchange,提问作者arvedjo
相关产品推荐
相关产品推荐

