使用Selenium Webdriver调用在Angularjs控制器中定义的函数

时间:2018-08-26 03:23:17

标签: angularjs selenium selenium-webdriver angularjs-scope webdriver

我们目前正在使用硒实现自动化。 我有一个定义如下的js角代码。

var app = angular.module('myApp', ['ngCookies']);
myController.$inject = ['$scope', '$cookies', '$http', '$timeout', '$window'];

function myController($scope, $cookies, $http, $timeout, $window) {
   var vm = this;
   vm.handleResponse = handleResponse;
    //More code 
    ....
   function handleResponse(Response) {
    .......
  }
}

我想从我的硒脚本中调用handleResponse函数。 我为非AngularJS代码使用了JavascriptExecutor,如下所示。但这似乎不适用于有角度的

JavascriptExecutor jse =  (JavascriptExecutor) driver;
jse.executeScript("var response = JSON.parse(JSON.stringify(" + sign + "));" +
        "window.handleResponse(response);");

如何用硒来做到这一点?

1 个答案:

答案 0 :(得分:0)

您为什么要执行应用程序的功能?使用硒进行测试时,通常将测试写为“黑匣子”,您不知道运行的是哪种客户端框架。

如果您确实想这样做,可以在调用addMockModule时检查量角器的功能,基本思路是:

  1. 标记为有角度以免自动引导(即使您使用了ng-app指令)。
  2. 将模拟模块添加为您的应用程序模块的依赖项。
  3. 手动引导应用模块。

查看code

另一种方法是使用调试信息加载angular(可以通过调用angular.reloadWithDebugInfo()来完成)。然后抓住您的根元素,并获取您的应用injector的引用。

const injector = angular.element(document.getElementById('root')).injector()
const $controller = injector.get('$controller');
const ctrlName = $controller('ctrlName', locals = {});
ctrlName.youFunc();

参考资料:

  1. $injector
  2. $controller