是否可以使用Nightmare.js(v2 Electron)将信息从浏览器传递到节点范围?

时间:2016-05-19 14:58:06

标签: node.js electron nightmare

我正在使用Nightmare.js(v2.3.3)自动化我的工作流程的一部分,我必须访问更新数据库的网站。我已经能够让Nightmare为.type.click.screenshot等基本内容工作,以验证我是否正在访问这些页面并输入我想要的信息。

我遇到困难,文档似乎缺乏,正在使用.evaluate从页面中提取信息。在文档中,它具有:

.evaluate(fn [,arg1,arg2,...])

var selector = 'h1';
var text = yield nightmare
  .evaluate(function (selector) {
    // now we're executing inside the browser scope. 
    return document.querySelector(selector).innerText;
   }, selector); // <-- that's how you pass parameters from Node scope to browser scope 

这一切都很好,但是实际上是否可以采用相反的方向并将信息从浏览器范围传递到Node范围?我想要做的是将页面上的所有复选框作为数组返回,然后在Nightmare脚本中循环显示它们。

我还搜索了许多GitHub问题和StackOverflow问题以找到答案,问题似乎是以前的版本是由PhantomJS构建的,而v2 +正在使用Electron,因此很难区分哪些答案实际上仍适用于当前版本。 Here是一个似乎对我有意义的答案,但它是在2014年,所以我认为它很可能是PhantomJS版本。作为参考,这个代码片段似乎有关于如何从浏览器转移到Node范围的答案:

var p1=1,
    p2 = 2;

nightmare
  .evaluate( function(param1, param2){
        //now we're executing inside the browser scope.
        return param1 + param2;
     }, function(result){
        // now we're inside Node scope again
        console.log( result);
     }, p1, p2 // <-- that's how you pass parameters from Node scope to browser scope
  ) //end evaluate
  .run();

但似乎当前版本的Nightmare不支持这种.evaluate(fn, cb, arg1, arg2,...)格式?

我想知道这是否可能在我疯狂之前!感谢您提供的任何帮助,如果您需要任何其他信息以帮助解答,请与我们联系。

1 个答案:

答案 0 :(得分:4)

你非常非常接近。最新的更新之一是以更有承诺的方式使用梦魇。这意味着您不必自己处理.evaluate()回调,结果将在链中传递。你的第二个例子,稍作调整:

nightmare = require('nightmare')();
nightmare.goto('http://example.com');

var p1=1,
    p2=2;

nightmare
  .evaluate( function(param1, param2){
        return param1 + param2;
     }, p1, p2)
  .then(function(result){
    console.log(result); //prints 3
  });

建议您使用.then(),但如果确实想要使用.run(),您可以:

nightmare = require('nightmare')();
nightmare.goto('http://example.com');
var p1=1,
    p2=2;

nightmare
  .evaluate( function(param1, param2){
        return param1 + param2;
     }, p1, p2)
  .run(function(err, result){
    console.log(result);
  });