我正在研究使用selenium webdriver测试的大型Angular应用程序。我担心的是,抄本需要时间,而且我需要反馈,以便在转录完成时通知我。这将允许我等到触发器触发以获取其他信息。有没有办法做到这一点?在加载完所有内容后,ng-repeat-end
之类的内容会被处理吗?
答案 0 :(得分:1)
无法判断DOM是否已完全呈现,但是当最后一个元素被$编译并使用简单指令添加到DOM时,您可以触发事件:
.directive('last', function() {
return {
link: function(scope) {
if(scope.$last) {
$scope.emit('ngRepeat.finished');
//or really anything you want to do
}
}
}
});
用法:
<div ng-repeat="item in items" last>
需要注意的是,如果&#34; items&#34;如果更改,则重建ng-repeat,这样您就可以获得另一个事件。
答案 1 :(得分:1)
我不清楚你是否想在ng-repeat之后得到一个事件,或者你只是想等到你可以保证它已经完成。
这是等待在jQuery和$ http中加载的驱动程序等待,结合角度的摘要/渲染周期(如果你不需要,你可以删除与摘要/渲染无关的部分) 。它包含在一个注释示例中,说明如何将其插入到C#selenium驱动程序调用中,该调用应转换为您使用的任何语言。
/*var pageLoadWait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(timeout));
pageLoadWait.Until<bool>(
(driver) =>
{
return (bool)JS.ExecuteScript(
@"*/
try {
if (document.readyState !== 'complete') {
return false; // Page not loaded yet
}
if (window.jQuery) {
if (window.jQuery.active) {
return false;
} else if (window.jQuery.ajax && window.jQuery.ajax.active) {
return false;
}
}
if (window.angular) {
if (!window.qa) {
// Used to track the render cycle finish after loading is complete
window.qa = {
doneRendering: false
};
}
// Get the angular injector for this app (change element if necessary)
var injector = window.angular.element('body').injector();
// Store providers to use for these checks
var $rootScope = injector.get('$rootScope');
var $http = injector.get('$http');
var $timeout = injector.get('$timeout');
// Check if digest
if ($rootScope.$$phase === '$apply' || $rootScope.$$phase === '$digest' || $http.pendingRequests.length !== 0 || $rootScope.$$applyAsyncQueue.length > 0) {
window.qa.doneRendering = false;
return false; // Angular digesting or loading data
}
if (!window.qa.doneRendering) {
// Set timeout to mark angular rendering as finished
$timeout(function() {
window.qa.doneRendering = true;
}, 0);
return false;
}
}
return true;
} catch (ex) {
return false;
}
/*");
});*/
编辑:在Jackie的评论之后,我注意到某些页面没有完全渲染的情况,添加
|| $rootScope.$$applyAsyncQueue.length > 0
似乎已经解决了这个问题。
答案 2 :(得分:0)
我认为上面的答案很好,但我认为这里的重点是即使ng-repeat指令隔离范围,它也有一个范围变量,它会告诉你它是否是最后一个。如果你正在角度方面发射一个事件或某事,那么之前的答案可能是最好的想法。但是,如果你的动机纯粹是基于测试的(就像我的那样),那就够了......
ng-class="{'last': $last}"