使用 puppeteer 覆盖浏览器日期

Rém*_*ski 4 google-chrome-headless puppeteer

我正在尝试设置 puppeteer 来运行一些性能测试。我想将日期覆盖为特定值,以便我可以模拟我的应用程序需要的数据,而无需根据日期动态生成内容。

如何覆盖 puppeteer 浏览器的日期?

小智 6

我们找到了一种更简单的方法来模拟 puppeteer 中的日期。这是我们的例子:

page.evaluate(() => {
  Date.now = () => {
    return 1539806611024;
  };
});
Run Code Online (Sandbox Code Playgroud)


小智 5

我最终遇到了同样的问题。这就是我设法解决它的方法:

// 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)
    })
}
Run Code Online (Sandbox Code Playgroud)

模拟 Date 的实际逻辑是从MockDate 库借用的。