【问题标题】:Is it possible to pass information from browser to Node scope using Nightmare.js (v2 Electron)?是否可以使用 Nightmare.js (v2 Electron) 将信息从浏览器传递到节点范围?
【发布时间】:2016-05-21 04:17:06
【问题描述】:

我正在使用 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 

这一切都很好,但实际上是否可以反过来将信息从浏览器范围传递到节点范围?我想做的是将页面上的所有复选框作为数组返回,然后在 Nightmare 脚本中循环遍历它们。

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

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,...)格式?

在我发疯之前,我只想知道这是否可能!感谢您的所有帮助,如果您需要任何其他信息来帮助回答,请告诉我。

【问题讨论】:

  • 我不明白。在您的第一个 sn-p text 中应该包含从页面上下文传递到节点上下文的值,不是吗?是吗?
  • @ArtjomB。不是我的理解。 yield nightmare 正在启动噩梦实例以遵循指令链。

标签: node.js electron nightmare


【解决方案1】:

你非常非常接近。最近的更新之一是以更有希望的方式使用 Nightmare。这意味着您不必自己处理.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);
  });

【讨论】:

  • 谢谢@Ross!实际上,我正在查看 GitHub 问题,并遇到了一些将我介绍给 .then 和 Promises 的答案。对我来说是全新的概念,但我明白 Nightmare 为何朝那个方向发展。那么传递给.then的参数就是链中上一个任务的返回值,本例是.evaluate?另外,.run 是什么?我在任何地方都找不到相关文档,这不是 Nightmare 的最佳做法吗?
  • 是的,.then() 函数的参数将是上一个动作的结果。 (这有点过于简单了,但在这里工作得很好。).run() 没有记录,因为它已经慢慢被弃用了。如果你好奇,可以在here找到关于它的对话。
  • 非常感谢您的帮助!我把头撞在墙上一个星期试图解决这个问题。我将不得不对 Promises 和 .then 进行更多阅读以了解它的全部潜力。我只是将您的答案设置为已接受的答案,希望这可以帮助刚开始使用 Nightmare 的其他人。
  • 乐于助人!对于它的价值,你可能想看看nightmare-examples,特别是关于native promises的例子。
  • 再次感谢!这是一个巨大的帮助。我觉得这绝对应该从官方文档中链接到。
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多