我试图遍历通过Nightmare.js获得的NodeList。在开发工具中执行按预期执行,但在ElectronI中无法成功将NodeList转换为数组。
nightmare
.goto('https://www.somePage.com')
.wait('#someID')
.evaluate(function () {
var links = document.querySelectorAll('div.someClass')
return links;
})
.end()
.then(function (result) {
console.log(result); // outputs the NodeList successfully.
var nodesArray = Array.prototype.slice.call(result);
console.log(nodesArray.length) // Always 0
})
.catch(function (error) {
console.error('Failed',
error);
})

我尝试通过各种其他方法移植NodeList。在Electron中没有任何接缝可以工作。同样,这在chrome工具中很容易实现。
答案 0 :(得分:0)
问题是HTMLElements或Nodes在页面上下文中是有效的。需要从evaluate()传递到then()的任何内容都是使用nightmare.ipc模块在内部发送的。这意味着返回的值将转换为字符串(JSON.stringify),然后再创建。
如果您查看开发者控制台日志,则会看到转换错误。
您可以评估evaluate函数本身的长度并传递它。
nightmare
.goto(url)
.evaluate(function(selector) {
var links = document.querySelectorAll(selector)
return links.length;
}, selector)
.then(function(result) {
console.log(result); // Outputs length.
})
.catch(function(error) {
console.error('Failed', error);
});
如果您需要在不同的evaluate()步骤中传递元素,那么您可以为它设置解决方法,但这是不同的故事