我正在使用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,...)
格式?
我想知道这是否可能在我疯狂之前!感谢您提供的任何帮助,如果您需要任何其他信息以帮助解答,请与我们联系。
答案 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);
});