【问题标题】:Electron Nightmare.js NodeList to ArrayElectron Nightmare.js 节点列表到数组
【发布时间】:2023-12-31 14:04:01
【问题描述】:

我正在尝试遍历通过 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 工具中很容易实现。

【问题讨论】:

    标签: node.js electron nightmare nodelist


    【解决方案1】:

    问题是 HTMLElements 或 Nodes 在页面上下文中是有效的。需要从 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);
      });
    

    如果您需要在不同的评估()步骤中传递元素,那么您可以有解决方法,但这是不同的故事

    【讨论】: