我正在构建一个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?
答案 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()
来实现页面上与之交互的元素之间的同步。