是否可以使用 Nightmare.js (v2 Electron) 将信息从浏览器传递到 Node 作用域?
Is it possible to pass information from browser to Node scope using Nightmare.js (v2 Electron)?
我正在使用 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 范围?我想做的是 return 页面上的所有复选框作为一个数组,然后在 Nightmare 脚本中循环遍历它们。
我也搜索了很多GitHub问题和Whosebug的问题来寻找答案,问题似乎是以前的版本是基于PhantomJS构建的,而v2+是使用Electron的,所以很难区分哪些答案实际上仍然适用于当前版本。 Here 是一个对我来说似乎有意义的答案,但那是在 2014 年,所以我认为它很可能是 PhantomJS 版本。作为参考,这是似乎对如何从浏览器转移到节点范围有答案的片段:
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,...)
格式?
我只想在我把自己逼疯之前知道这是否可行!感谢您提供的所有帮助,如果您需要任何其他信息来帮助回答,请告诉我。
你非常非常接近。最近的更新之一是以更有希望的方式使用 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);
});
我正在使用 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 范围?我想做的是 return 页面上的所有复选框作为一个数组,然后在 Nightmare 脚本中循环遍历它们。
我也搜索了很多GitHub问题和Whosebug的问题来寻找答案,问题似乎是以前的版本是基于PhantomJS构建的,而v2+是使用Electron的,所以很难区分哪些答案实际上仍然适用于当前版本。 Here 是一个对我来说似乎有意义的答案,但那是在 2014 年,所以我认为它很可能是 PhantomJS 版本。作为参考,这是似乎对如何从浏览器转移到节点范围有答案的片段:
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,...)
格式?
我只想在我把自己逼疯之前知道这是否可行!感谢您提供的所有帮助,如果您需要任何其他信息来帮助回答,请告诉我。
你非常非常接近。最近的更新之一是以更有希望的方式使用 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);
});