我在 jest-image-shot 和 puppeteer repos 中浏览了几个问题。然而,我还没有找到合适的解决方案。基本上,我想要做的是,允许 jesttoMatchImageSnapshot
在 puppeteer chrome 实例的执行页面中忽略某些元素或区域来运行它。
jest-image-shot 本身中的任何指针或现有解决方案,或者在执行 puppeteer 期间删除元素是解决它的唯一方法?
我在 jest-image-shot 和 puppeteer repos 中浏览了几个问题。然而,我还没有找到合适的解决方案。基本上,我想要做的是,允许 jesttoMatchImageSnapshot
在 puppeteer chrome 实例的执行页面中忽略某些元素或区域来运行它。
jest-image-shot 本身中的任何指针或现有解决方案,或者在执行 puppeteer 期间删除元素是解决它的唯一方法?
不,你想要的不是那样容易实现的。库jest-image-snapshot使用库pixelmatch来比较两个图像。这意味着它实际上比较了图像的像素,而不对文档本身执行任何逻辑。
你有三个选择:
failureThreshold
定义可以相差多少failureThreshold
该库有一个名为failureThreshold
built-in 的选项,它允许在比较图像时定义一个阈值。此阈值适用于整个图像,而不是特定于图像的元素或部分。根据您的用例,如果您要忽略的页面部分很小并且其他微小的更改可能是可以容忍的,这可能会很有用。
代码示例
it('...', async () => {
// ...
expect(image).toMatchImageSnapshot({
failureThreshold: '0.01',
failureThresholdType: 'percent'
});
});
这将是最简单的方法。删除要忽略的元素。如果剩余页面没有因此而完全改变,这可能是最简单和最好的方法。
代码示例
it('...', async () => {
const page = await browser.newPage();
await page.goto('...');
await page.execute(() => {
// remove element from the DOM
const el = document.querySelector('#element-selector');
el.parentElement.removeChild(el);
});
const image = await page.screenshot();
expect(image).toMatchImageSnapshot();
});
如果选项 2 由于某种原因不可行,您也可以操纵图像本身。首先,检查页面内元素的位置及其高度和重量,然后将该位置的图像部分变黑。
要获取元素的位置和大小,可以使用以下代码:
const [top, left, weight, height] = await page.execute(() => {
const el = document.querySelector('#element-selector');
const rect = element.getBoundingClientRect();
return [rect.top, rect.left, rect.width, rect.height];
});