如何使用Protractor

时间:2016-11-01 18:17:50

标签: angularjs protractor long-polling

我正在构建一个Angular应用程序,它使用长轮询来在服务器上发生更改时接收快速更新。我使用这样的$ resource来获取实际数据:

appServices.factory('Data', ['$resource', 
  function(){
    return $resource('', {}, {
        query: {"url": …, isArray: false}
  });
}]);

然后我有一个负责长轮询的服务:等待数据加载;将它们存放在某处;一秒钟后,开始下一个长轮询周期:

app.factory(„DataLoader“, [„Data“, "$timeout", function(Data, $timeout) {
    return {
            loadData: function() {
                var parent = this;
                var data = Data.query({},
                        function(result) {
                          /* do something to the data,
                           * then start waiting for an update from the server again
                           */
                           $timeout(function() {
                                parent.loadData();
                           }, 1000);
                        }
                );
            }
     };
});

到目前为止它的功能就像一个魅力。

但是,我现在正在尝试为此编写Protractor测试。问题是:只有在数据没有变化的情况下,服务器才会在30秒后超时长轮询请求。当我在等待$ timeout内的新数据时,Protractor会在任何结果到来之前超时。

我在最后一小时用谷歌搜索了,但除了使用$ interval而不是$ timeout之外似乎没有解决方案。这适用于良好的旧轮询设置(每3秒轮询一次,如果没有新内容,则从服务器获取空结果)。但是,为了避免这种情况,我实施了长轮询。 $ timeout对我来说是更明智的选择。

您能否告诉我如何在这种环境下成功运行Protractor?

2 个答案:

答案 0 :(得分:0)

我建议你看看Protractor's documentation on timeouts。您可能需要增加配置文件中的unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, shellapi; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin i := ShellExecute(Handle, nil, 'cmd.exe', PChar(' dir'), nil, SW_SHOW); caption := inttostr(i); end; end. ,因为默认等待页面同步是11秒。

答案 1 :(得分:0)

使用$interval角度api和$fetch连续轮询应用程序中的数据

如果您不想使用$interval而不是$timeout;这不是一个好习惯, 那么您必须关闭浏览器与角度browser.waitForAngularEnabled(false)的同步,并使用browser.sleep()browser.wait()来实现页面上与之交互的元素之间的同步。