Electron Nightmare.js NodeList转数组
Electron Nightmare.js NodeList to Array
我正在尝试遍历通过 Nightmare.js 获得的 NodeList。在开发工具中执行按预期执行,但在 Electron 中我无法将 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 工具中很容易实现。
问题是 HTML 元素或节点在页面上下文中有效。任何需要从 evaluate() 传递到 then() 的东西都使用 nightmare.ipc 模块在内部发送。这意味着返回值被转换为字符串 (JSON.stringify),然后创建回来。
如果您检查开发者控制台日志,您会看到转换错误。
您可以在评估函数本身中评估长度并传递它。
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() 步骤中传递元素,那么您可以有解决方法,但那是另一回事
我正在尝试遍历通过 Nightmare.js 获得的 NodeList。在开发工具中执行按预期执行,但在 Electron 中我无法将 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 工具中很容易实现。
问题是 HTML 元素或节点在页面上下文中有效。任何需要从 evaluate() 传递到 then() 的东西都使用 nightmare.ipc 模块在内部发送。这意味着返回值被转换为字符串 (JSON.stringify),然后创建回来。
如果您检查开发者控制台日志,您会看到转换错误。
您可以在评估函数本身中评估长度并传递它。
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() 步骤中传递元素,那么您可以有解决方法,但那是另一回事