Javascript 与开发工具交互,同时使用.evaluate刮取噩梦.js
我正在尝试自动化我在devtools中手动执行的流程。在开发人员控制台中,我将创建一个变量对象: var api=angular.elementdocument.body.injector.get'apiFactory' 然后调用api对象api.getDataarg,然后返回一个对象{} 我怎样才能在噩梦中得到上面那样的返回对象。下面类似地计算函数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
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链接