用puppeteer覆盖浏览器日期

时间:2018-03-01 10:14:50

标签: puppeteer google-chrome-headless

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

如何覆盖木偶操纵者的日期?

3 个答案:

答案 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借来的。