如何在 backstop 中模拟全局对象。js/puppetter
how to mock on global object in backstop.js/puppetter
因此 backstop.js provides ability 到 运行 针对底层引擎的自定义脚本。我使用 puppeteer 作为引擎,所以我尝试用 'onReadyScript':
模拟 Date.now
page.evaluate('window.Date.now = () => 0; Date.now = () => 0;');
...
page.addScriptTag({
// btw `console.log` here is not executed, do I use it in wrong way?
content: 'Date.now = () => 0;'
});
...
page.evaluate(() => {
window.Date.now = () => 0;
Date.now = () => 0;
});
我认为最后一个是在 Node 的上下文中修改 Date,而不是在 puppeteer 中,但无论如何也尝试过。
没有任何效果,测试下的脚本仍然输出真实Date.now
。我也检查了 Override the browser date with puppeteer 但它对我没有帮助。
是的,我知道我可以跳过特定的选择器,但这并不总是有意义(想想带箭头的时钟)。
在尝试 onBeforeScript
和 evaluateOnNewDocument()
之后,它对我有用。完整脚本:
module.exports = async function (page, scenario) {
if (!page.dateIsMocked) {
page.dateIsMocked = true
await page.evaluateOnNewDocument(() => {
const referenceTime = '2010-05-05 10:10:10.000';
const oldDate = Date;
Date = function(...args) {
if (args.length) {
return new oldDate(...args);
} else {
return new oldDate(referenceTime);
}
}
Date.now = function() {
return new oldDate(referenceTime).valueOf();
}
Date.prototype = oldDate.prototype;
})
}
};
原因:onReadyScript
is executed当正在测试的页面已经加载并执行时。所以代码通过闭包绑定到原始 Date
,而不是模拟版本。
因此 backstop.js provides ability 到 运行 针对底层引擎的自定义脚本。我使用 puppeteer 作为引擎,所以我尝试用 'onReadyScript':
模拟Date.now
page.evaluate('window.Date.now = () => 0; Date.now = () => 0;');
...
page.addScriptTag({
// btw `console.log` here is not executed, do I use it in wrong way?
content: 'Date.now = () => 0;'
});
...
page.evaluate(() => {
window.Date.now = () => 0;
Date.now = () => 0;
});
我认为最后一个是在 Node 的上下文中修改 Date,而不是在 puppeteer 中,但无论如何也尝试过。
没有任何效果,测试下的脚本仍然输出真实Date.now
。我也检查了 Override the browser date with puppeteer 但它对我没有帮助。
是的,我知道我可以跳过特定的选择器,但这并不总是有意义(想想带箭头的时钟)。
在尝试 onBeforeScript
和 evaluateOnNewDocument()
之后,它对我有用。完整脚本:
module.exports = async function (page, scenario) {
if (!page.dateIsMocked) {
page.dateIsMocked = true
await page.evaluateOnNewDocument(() => {
const referenceTime = '2010-05-05 10:10:10.000';
const oldDate = Date;
Date = function(...args) {
if (args.length) {
return new oldDate(...args);
} else {
return new oldDate(referenceTime);
}
}
Date.now = function() {
return new oldDate(referenceTime).valueOf();
}
Date.prototype = oldDate.prototype;
})
}
};
原因:onReadyScript
is executed当正在测试的页面已经加载并执行时。所以代码通过闭包绑定到原始 Date
,而不是模拟版本。