首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在backtop.js/puppetter中模拟全局对象

如何在backtop.js/puppetter中模拟全局对象
EN

Stack Overflow用户
提问于 2020-03-28 12:20:03
回答 1查看 300关注 0票数 0

因此,backstop.js 提供能力可以针对底层引擎运行自定义脚本。我使用傀儡机作为引擎,所以我尝试用‘onReadyScript’来模拟Date.now

代码语言:javascript
复制
page.evaluate('window.Date.now = () => 0; Date.now = () => 0;');
...
page.addScriptTag({
  // btw `console.log` here is not executed, do I use it in wrong way?
  content: 'Date.now = () => 0;' 
});
...
page.evaluate(() => {
  window.Date.now = () => 0;
  Date.now = () => 0;
});

最后一个,我认为,是在Node的上下文中修改日期,而不是在木偶师内部,但无论如何也尝试过了。

没有什么效果,测试下的脚本仍然输出真实的Date.now。此外,我检查了用木偶师重写浏览器日期,但这对我没有帮助。

是的,我知道我可以跳过特定的选择器,但这并不总是有意义的(想想有箭头的时钟)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 13:11:16

在尝试了onBeforeScriptevaluateOnNewDocument()之后,它对我很有用。完整脚本:

代码语言:javascript
复制
module.exports = async function (page, scenario) {
    if (!page.dateIsMocked) {
        page.dateIsMocked = true
        await page.evaluateOnNewDocument(() => {
            const referenceTime = '2010-05-05 10:10:10.000';
            const oldDate = Date;
            Date = function(...args) {
                if (args.length) {
                    return new oldDate(...args);
                } else {
                    return new oldDate(referenceTime);
                }
            }
            Date.now = function() {
                return new oldDate(referenceTime).valueOf();
            }
            Date.prototype = oldDate.prototype;
        })
    }
};

原因:当正在测试的页面已经加载和执行时,被执行。因此,代码通过闭包绑定到原始的Date,而不是模拟的版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60901052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档