【问题标题】:Override the browser date with puppeteer用 puppeteer 覆盖浏览器日期
【发布时间】:2018-08-09 09:13:00
【问题描述】:

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

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

【问题讨论】:

    标签: puppeteer google-chrome-headless


    【解决方案1】:

    根据 puppeteer 的灯塔文档,我得到了它的工作。 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】:

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

    page.evaluate(() => {
      Date.now = () => {
        return 1539806611024;
      };
    });
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        相关资源
        最近更新 更多