我可以为Playwright浏览器设置日期吗?

12

当我编写要在Playwright中运行的测试时,我希望能够设置浏览器在测试开始时所信奉的日期。使用Playwright有没有办法实现这一点?

4个回答

3

使用这种方法更容易

    page.evaluate(() => {
      Date.now = () => {
        return 1609477200000; //Jan 1, 2021
      };
    });

1
如果代码调用了 new Date(),这并没有什么帮助。 - Shaddix
1
您可以在 https://github.com/microsoft/playwright/issues/6347#issuecomment-1085850728 中找到 new Date() 的解决方案。 - Alexey Romanov
有人知道如何在后台脚本中实现这个吗? - Sorix

2

我在GitHub Issue中找到了一个简单的解决方案。

  async clock(value) {
    const date = new Date(value).valueOf();
    await page.addInitScript(`{
      // Extend Date constructor to default to fakeNow
      Date = class extends Date {
        constructor(...args) {
          if (args.length === 0) {
            super(${date.valueOf()});
          } else {
            super(...args);
          }
        }
      }
      // Override Date.now() to start from fakeNow
      const __DateNowOffset =${date.valueOf()} - Date.now();
      const __DateNow = Date.now;
      Date.now = () => __DateNow() + __DateNowOffset;
    }`);
  }

  await clock("2022/01/01")

2
你可以使用像TimeShift这样的模拟工具。 这段代码将注入timeshift库,然后将日期设置为2012年2月2日:
const playwright = require("playwright");

(async () => {

    let removed = false;
    const browser = await playwright["chromium"].launch({headless: false});
    const page = await browser.newPage();
    await page.setContent('<a href="#" onclick="document.querySelector(\'span\').innerText = new Date().toString()">Test me</a><span></span>');
    await page.click('a');
    console.log(await page.innerText('span'));
    await page.addScriptTag({ url: 'https://cdn.jsdelivr.net/npm/timeshift-js@1.1.1/timeshift.js'});
    await page.evaluate(() => {
        Date = TimeShift.Date; 
        TimeShift.setTime(1328230923000); 
    });
    await page.click('a');
    console.log(await page.innerText('span'));
    browser.close();
})();

输出:

Fri Sep 18 2020 15:06:58 GMT-0300 (Argentina Standard Time)
Thu Feb 02 2012 22:02:03 GMT-0300

1

没有勾选功能的版本:

    page.on('load', () => {
        page.evaluate(() => {
            const OriginalDate = window.Date;

            class MockDate extends OriginalDate {
                static currentDate = '18 May 2018 12:00 UTC';
                static currentTimeStamp = (new OriginalDate(MockDate.currentDate)).getTime();

                constructor(...args) {
                    const params = (args && args.length) ? args : [MockDate.currentTimeStamp];

                    super(...params);
                }

                static [Symbol.hasInstance](instance: Date) {
                    return typeof instance.getDate === 'function';
                }

                static now() {
                    return MockDate.currentTimeStamp;
                }
            }

            window.Date = MockDate;
        });
    });

    await page.goto(yourUrl);

带有勾选的版本:

    page.on('load', () => {
        page.evaluate(() => {
            const OriginalDate = window.Date;

            class MockDate extends OriginalDate {
                static currentDate = '18 May 2018 12:00 UTC';
                static currentTimeStamp = (new OriginalDate(MockDate.currentDate)).getTime();
                static originalNow = OriginalDate.now();

                constructor(...args) {
                    const params = (args && args.length) ? args : [(MockDate.currentTimeStamp + MockDate.getTick())];

                    super(...params);
                }

                static [Symbol.hasInstance](instance: Date) {
                    return typeof instance.getDate === 'function';
                }

                static getTick() {
                    return OriginalDate.now() - MockDate.originalNow;
                }

                static now() {
                    return MockDate.currentTimeStamp + MockDate.getTick();
                }
            }

            window.Date = MockDate;
        });
    });

    await page.goto(yourUrl);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接