我有一些UI测试试图测试元素上的点击是否会显示其他内容。现在检查所有测试,看看DOM是否准备就绪,但是在那个甚至触发和app.controller()调用所有完成我的测试可以跳转的地方之间有少量时间in错误地确定没有添加点击处理程序。
我可以使用angular.element(' [ng-controller = myController]')。scope()来确定是否定义了范围,但是测试可以使用的窗口仍然非常小在点击处理程序绑定之前运行(一个非常非常小的窗口)。
<div ng-controller="myController">
<div ng-click="doWork()"></div>
</div>
任何人都可以看到一种方法来判断是否添加了点击处理程序吗?
PS:当控制器加载时,控制器内会发生一个事件:$scope.$on('$viewContentLoaded', function(){ });
但除非我在控制器中订阅并标记变量,否则这对我没有帮助。我可以通过Selenium检查的地方。
PPS:其中很多类都会在范围发生变化时发生变化,并且可以用来触发测试,但很多都没有。
答案 0 :(得分:3)
有一个用于测试AngularJS应用程序的专用工具 - protractor
。它基本上是WebDriverJS的包装 - selenium javascript webdriver。
使用protractor
的主要好处是知道Angular何时安定下来并准备好。它使您的测试以自然的方式流动,而不必使用显式等待:
您不再需要为测试添加等待和睡眠。量角器 可以自动执行测试中的下一步 网页完成待处理任务,因此您不必担心 等待您的测试和网页同步。
它还提供了几个独特的AngularJS特定定位器,如by.model
,by.binding
等。通常,它为端到端测试提供了非常convenient and well-designed API。< / p>
答案 1 :(得分:2)
这里有两个问题需要克服:
Angular提供了一个名为“getTestability”的方法,可以使用任何元素调用(假设您已包含它,它是可选的)。用法:
angular.getTestability(angular.element('body')).whenStable(function(){/*Do things*/})
这似乎解决了第一个问题......
但是,现在Done在这种情况下意味着什么。完成意味着任何使用$ browser.defer的内容都将被执行。那是什么意思?不知道,但在实践中,它至少会验证在调用回调时没有正在进行的http请求。
好的,现在Selenium ...您可以要求它在客户端上执行JavaScript并使用上面的代码来设置变量。 .whenStable(function(){window.someVar=true})
然后在测试中轮询,直到设置该变量。
这会抓住所有“完成”的情况吗?可能不是,但它使我的测试更加一致。只要它有效,我就不会在这个问题上更难思考。
那就是说,我不是把这个标记为答案。这感觉就像一个肮脏的解决方案。