Javascript 与开发工具交互,同时使用.evaluate刮取噩梦.js

Javascript 与开发工具交互,同时使用.evaluate刮取噩梦.js,javascript,angularjs,google-chrome-devtools,electron,nightmare,Javascript,Angularjs,Google Chrome Devtools,Electron,Nightmare,我正在尝试自动化我在devtools中手动执行的流程。在开发人员控制台中,我将创建一个变量对象: var api=angular.elementdocument.body.injector.get'apiFactory' 然后调用api对象api.getDataarg,然后返回一个对象{} 我怎样才能在噩梦中得到上面那样的返回对象。下面类似地计算函数 vo(run(arg)) .then(function(result) { console.log(result); }, f

我正在尝试自动化我在devtools中手动执行的流程。在开发人员控制台中,我将创建一个变量对象:

var api=angular.elementdocument.body.injector.get'apiFactory'

然后调用api对象api.getDataarg,然后返回一个对象{}

我怎样才能在噩梦中得到上面那样的返回对象。下面类似地计算函数

vo(run(arg)) 
   .then(function(result) {
   console.log(result);   
}, function(err) {
    console.log(err);
}); 

var run = function * (arg){ 
   nightmare.goto('https://...')

   var result = nightmare.evaluate((arg) => {
      var api = angular.element(document.body).injector().get('apiFactory')
      return api.getData(arg);     
   },result);

   yield nightmare.end();
};

可以安全地假设AngularJS应用程序在检索injector时还没有启动

可以为evaluate内的代码提供延迟,可以手动设置setTimeout或ready event listener:

   var result = yield nightmare.evaluate((arg, done) => {
      angular.element(() => {
        var api = angular.element(document.body).injector().get('apiFactory')
        done(api.getData(arg));
      });
   },result);
也可以等待应用程序引导:

   var result = yield nightmare.wait('.ng-scope').evaluate((arg) => {
      var api = angular.element(document.body).injector().get('apiFactory')
      return api.getData(arg);     
   },result);

等待ng scope类,在这种情况下,应该等待特定于应用程序的选择器。

我手头没有噩梦来尝试这个,但这是意料之中的,因为evaluate回调是浏览器范围,其他所有内容都是节点;它不能用魔法通过物体。这取决于此数据是什么,但通常您可能希望在内部使用JSON.stringify对其进行序列化,然后使用JSON.parse.Right进行反序列化。所以,当我执行stringify时,我返回“{$$state:{status:0}}”,你知道我为什么没有获得状态1吗?这是一个承诺。您在问题中忽略了服务实现,但事实确实如此。在序列化和返回它之前,先将其与then链接