我正在尝试设置puppeteer来运行一些性能测试。 我想将日期覆盖到特定值,以便我可以模拟我的应用程序所需的数据,而无需根据日期动态生成内容。
如何覆盖木偶操纵者的日期?
答案 0 :(得分:2)
我们找到了一种更简单的方法来模拟人偶中的日期。这是我们的示例:
page.evaluate(() => {
Date.now = () => {
return 1539806611024;
};
});
答案 1 :(得分:0)
基于木偶操作者周围的灯塔文档,我得到了它的工作。 https://github.com/GoogleChrome/lighthouse/blob/master/docs/puppeteer.md
基本上这样做是为了覆盖Date.now
:
browser.on('targetchanged', async target => {
const targetPage = await target.page();
const client = await targetPage.target().createCDPSession();
await client.send('Runtime.evaluate', {
expression: `Date.now = function() { return 0; }`
});
});
答案 2 :(得分:0)
我最终遇到了同样的问题。这是我设法解决的方法:
// mock date of document
if (!page.dateIsMocked) {
page.dateIsMocked = true
await page.evaluateOnNewDocument(() => {
var _Date = Date,
_getTimezoneOffset = Date.prototype.getTimezoneOffset,
now = null
function MockDate(y, m, d, h, M, s, ms) {
var date
switch (arguments.length) {
case 0:
if (now !== null) {
date = new _Date(now)
} else {
date = new _Date()
}
break
case 1:
date = new _Date(y)
break
default:
d = typeof d === 'undefined' ? 1 : d
h = h || 0
M = M || 0
s = s || 0
ms = ms || 0
date = new _Date(y, m, d, h, M, s, ms)
break
}
return date
}
MockDate.UTC = _Date.UTC
MockDate.now = function() {
return new MockDate().valueOf()
}
MockDate.parse = function(dateString) {
return _Date.parse(dateString)
}
MockDate.toString = function() {
return _Date.toString()
}
MockDate.prototype = _Date.prototype
function set(date, timezoneOffset) {
var dateObj = new Date(date)
if (isNaN(dateObj.getTime())) {
throw new TypeError(
'mockdate: The time set is an invalid date: ' + date
)
}
if (typeof timezoneOffset === 'number') {
MockDate.prototype.getTimezoneOffset = function() {
return timezoneOffset
}
}
Date = MockDate
now = dateObj.valueOf()
}
// mock date
set(1577840400000)
})
}
模拟日期的实际逻辑是从MockDate library借来的。