如何告诉Selenium Angular控制器已经加载了#34;

时间:2015-06-18 17:44:48

标签: javascript angularjs selenium

我有一些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:其中很多类都会在范围发生变化时发生变化,并且可以用来触发测试,但很多都没有。

2 个答案:

答案 0 :(得分:3)

有一个用于测试AngularJS应用程序的专用工具 - protractor。它基本上是WebDriverJS的包装 - selenium javascript webdriver。

使用protractor的主要好处是知道Angular何时安定下来并准备好。它使您的测试以自然的方式流动,而不必使用显式等待:

  

您不再需要为测试添加等待和睡眠。量角器   可以自动执行测试中的下一步   网页完成待处理任务,因此您不必担心   等待您的测试和网页同步。

它还提供了几个独特的AngularJS特定定位器,如by.modelby.binding等。通常,它为端到端测试提供了非常convenient and well-designed API。< / p>

答案 1 :(得分:2)

这里有两个问题需要克服:

  • 我们如何知道Angular何时完成(子问题是“做什么意思?”
  • 我们如何将这些信息提供给Selenium

Angular提供了一个名为“getTestability”的方法,可以使用任何元素调用(假设您已包含它,它是可选的)。用法: angular.getTestability(angular.element('body')).whenStable(function(){/*Do things*/}) 这似乎解决了第一个问题...... 但是,现在Done在这种情况下意味着什么。完成意味着任何使用$ browser.defer的内容都将被执行。那是什么意思?不知道,但在实践中,它至少会验证在调用回调时没有正在进行的http请求。

好的,现在Selenium ...您可以要求它在客户端上执行JavaScript并使用上面的代码来设置变量。 .whenStable(function(){window.someVar=true})然后在测试中轮询,直到设置该变量。

这会抓住所有“完成”的情况吗?可能不是,但它使我的测试更加一致。只要它有效,我就不会在这个问题上更难思考。

那就是说,我不是把这个标记为答案。这感觉就像一个肮脏的解决方案。