如何让 Protractor 不等待 $timeout?

2023-11-25

我正在使用 Protractor 测试我的角度应用程序。 用户登录到我的应用程序后,我设置了 $timeout 以在一小时内完成某些工作(因此,如果用户在 13:00 登录,$timeout 将在 14:00 运行)。 我不断遇到这些失败:

"Timed out waiting for Protractor to synchronize with the page after 20 seconds. Please see https://github.com/angular/protractor/blob/master/docs/faq.md. The following tasks were pending: - $timeout: function onTimeoutDone(){....."

我读过这个超时页面:https://github.com/angular/protractor/blob/master/docs/timeouts.md所以我知道量角器会等到页面完全加载,这意味着他正在等待 $timeout 完成......

我怎样才能让量角器不等待$超时? 我不想使用:

browser.ignoreSynchronization = true;

因为这样我的测试将因其他原因而失败(其他角度组件仍然需要时间加载......)


解决方案是刷新活动超时(正如 @MBielski 在评论中提到的),但原始的刷新方法本身仅在角度模拟中可用。要直接使用 Angular-Mocks,您必须将其作为<script>标签,而且您还必须处理它创建的所有覆盖,它会产生很多副作用。我能够在不使用角度模拟的情况下重新创建刷新,方法是监听创建的任何超时,然后根据需要重置它们。

例如,如果您的 Angular 应用程序超时:

$timeout(function () {
    alert('Hello World');
}, 10000); // say hello in 10 sec

测试将如下所示:

it('should reset timeouts', function () {

    browser.addMockModule('e2eFlushTimeouts', function () {

        angular
        .module('e2eFlushTimeouts', [])
        .run(function ($browser) {

            // store all created timeouts
            var timeouts = [];

            // listen to all timeouts created by overriding
            // a method responsible for that
            var originalDefer = $browser.defer;

            $browser.defer = function (fn, delay) {
                // originally it returns timeout id
                var timeoutId = originalDefer.apply($browser, arguments);
                // store it to be able to remove it later
                timeouts.push({ id: timeoutId, delay: delay });
                // preserve original behavior
                return timeoutId;
            };

            // compatibility with original method
            $browser.defer.cancel = originalDefer.cancel;

            // create a global method to flush timeouts greater than @delay
            // call it using browser.executeScript()
            window.e2eFlushTimeouts = function (delay) {
                timeouts.forEach(function (timeout) {
                    if (timeout.delay >= delay) {
                        $browser.defer.cancel(timeout.id);
                    }
                });
            };

        });

    });


    browser.get('example.com');

    // do test stuff

    browser.executeScript(function () {
        // flush everything that has a delay more that 6 sec
        window.e2eFlushTimeouts(6000); 
    });

    expect(something).toBe(true);
});

这有点实验性,我不确定它是否适合你的情况。这段代码也可以通过移动来简化browser.addMockModule到一个单独的node.js 模块。如果您想删除短超时(例如 100 毫秒),也可能会出现问题,它可以取消当前正在运行的 Angular 进程,因此测试将中断。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Protractor 不等待 $timeout? 的相关文章

随机推荐

  • 如何使用结构体属性设置默认值?

    我想知道如何将 DefaultValue 属性应用于结构属性 您可以注意到 Microsoft 使用表单的大小和许多其他属性来实现这一点 它们的值的类型是 Size Point 等 我想对我的自定义结构做同样的事情 DefaultValue
  • 如何在Python中获取匹配行之后的行

    我是一个业余爱好者 断断续续地使用 Python 一段时间了 抱歉 如果这是一个愚蠢的问题 但我想知道如果输入文件中的格式如下所示 是否有人知道一种简单的方法来获取一堆行 标题 1 Line 1 Line 2 Line 3 标题 2 Lin
  • 创建忽略鼠标和按键事件的 JavaFX 透明窗口

    我想制作一个 JavaFX 应用程序 基本上用一个覆盖整个用户屏幕Canvas对象 所以基本上我可以在用户屏幕上绘制任何内容 制作一个覆盖整个屏幕的窗口很简单 通过本教程可以使其基本上透明 https assylias wordpress
  • 用Java计算两个日期之间的天数

    我想要一个计算两个日期之间的天数的 Java 程序 输入第一个日期 德语表示法 带空格 dd mm yyyy 输入第二个日期 该程序应计算两个日期之间的天数 如何包含闰年和夏令时 My code import java util Calen
  • 响应式 UI 提示

    当我想创建响应式用户界面时 我只想要一些提示 我知道如何使用 Dispatcher Task BackgroundWorker Threads 我正在寻找更多高级提示 例如绑定提示 当我的 UI 上有 50 多个控件需要更新时 Priori
  • 缺少 python bz2 模块

    我已经安装在我的主目录中 spatel dev1 home spatel python 2 7 3 bin python V Python 2 7 3 我正在尝试运行一个需要 python 2 7 x 版本的脚本 但出现丢失 bz2 错误
  • 可以通过 Apache 下载文件吗?

    Path var lib foo txt 是否可以配置 Apache 以便有一些 HTTP URL 可以启动该文件的下载以及如何配置 Without htaccess file 那么那个 URL 会是什么 localhost var lib
  • Google 云存储 CNAME URL 重定向

    我在 Google Cloud 存储上有一个公共存储桶 wordgamesswf 可以通过网址访问对象http commondatastorage googleapis com wordgamesswf linguistics 我需要托管我
  • 原型还是内联,有什么区别?

    我刚刚学习 Javascript 我想知道是否使用原型声明 如下所示 function TSomeObj this name my object TSomeObj prototype showname function alert this
  • Pickle 类实例加上定义?

    我怀疑这是一个常见问题 但我还没有找到解决方案 我想要的非常简单 而且在技术上似乎是可行的 我有一个简单的 python 类 我想将它存储在光盘上 实例和定义在一个文件中 Pickle 将存储数据 但不存储类定义 有人可能会说类定义已经存储
  • 如何使 jenkins 在 Windows 批处理命令失败时失败?

    我在 jenkins 中使用一些 Windows 批处理命令 其中每个命令都可能失败 为了使 jenkins 作业在每一步都失败 这些批处理命令如下所示 net use m IP ADDRESS Whatever PASSWORD user
  • 在 Android 中直接将捕获的图像上传到 Cloudinary

    我想捕捉一张图片并直接上传到Cloudinary 我如何知道图片的名称以在上传声明中设置它cloudinary uploader upload nameofthepic Cloudinary emptyMap 这是我的代码 public c
  • 正则表达式捕获两个分隔符内单词的每次出现

    假设我有一长串文本 我想捕获每个单词this是在圆括号内提到的 我怎么能这么做呢 以下模式仅匹配第一个this 忽略之后出现的每一个事件 this g 例如 在以下文本上使用上面的模式 Etiam scelerisque nunc ac e
  • 使用 iText5 for .NET 读取 PDF 文件

    我使用 C 作为编程平台iTextSharp阅读 PDF 内容 我使用下面的代码来读取内容 但似乎是每页读取的 public string ReadPdfFile object Filename string strText string
  • 如何在其他类中使用PDO连接?

    我认为我在理解 OOP 的工作原理方面存在问题 我已经更改了它可以工作的代码 但这不是我认为的正确方式 以下场景 不 我不是自己创建用户登录 它实际上只是为了本地开发人员更好地理解 OOP 我有一个database php 文件 class
  • iOS Safari 隐私浏览 localStorage 和 sessionStorage 支持吗?

    我在 StackOverflow 上发现了一些问题 解决了 iOS Safari Private Browsing 的特定功能和sessionStorage and localStorage 但我还没有找到明确的资源来表示 iOS Safa
  • WebRequest 不发送客户端证书

    我正在为 REST API 编写一个客户端 为了对 API 进行身份验证 我必须使用提供给我的证书 这段代码如下 public string GetCustomer int custId X509Certificate2 Cert new
  • fgetcsv 正在吃掉字符串的第一个字母(如果它是变音符号)

    我正在将 Excel 生成的 CSV 文件中的内容导入到 XML 文档中 例如 csv fopen csvfile r words array while pair fgetcsv csv FALSE array push words ar
  • TurboParser 的依赖解析输出是什么意思?

    我一直在尝试使用由生成的依赖解析树CMU 的 TurboParser 它工作完美 但问题是文档太少 我需要精确理解他们的解析器的输出 例如 这句话 我用统计方法解决了这个问题 生成以下输出 1 I PRP PRP 2 SUB 2 solve
  • 如何让 Protractor 不等待 $timeout?

    我正在使用 Protractor 测试我的角度应用程序 用户登录到我的应用程序后 我设置了 timeout 以在一小时内完成某些工作 因此 如果用户在 13 00 登录 timeout 将在 14 00 运行 我不断遇到这些失败 Timed