如何在浏览器范围内设置全局变量.wait(fn) NightmareJS

How to set a global variable in Browser scope .wait(fn) NightmareJS

我想根据我正在抓取的网络设置一个全局变量。但是,我只能使用 .evaluate 和 .then 来做到这一点。这不是我需要的,因为在那之后我无法 运行 任何东西。

感谢您的帮助! :)

var global;

nightmare
.goto(url)
.wait(() => {
  global = document.getElementById("element").textContent;
})
.click()
.wait()
.more...

人们会告诉你不要用全局变量做事。我猜你只是想在一些小脚本中存储和使用一些数据。有几种方法可以保存变量供以后使用。我现在不会通过数据库和类似的东西。

Window Nightmare 实例中的对象

您可以使用 window 对象,因为只要您在同一页面并且不刷新页面,它就会存在。

await nightmare
.goto(url)
.evaluate(() => {
  window.aGlobalVariable = document.getElementById("element").textContent;
})

稍后只要您在同一页面中,您就可以稍后再调用它。

await nightmare
.evaluate(() => {
  console.log(`${aGlobalVariable} looks tasty`);
})

在上下文之间保存和传递变量

let aGlobalVariable;
aGlobalVariable = await nightmare
.goto(url)
.evaluate(() => {
  return document.getElementById("element").textContent;
})

现在您可以从 nodeJS 上下文访问 aGlobalVariable。 每当你想再次在 nightmareJS 中使用它时,如果你愿意,你可以再次将它传递给浏览器。

await nightmare
.goto(url)
.evaluate((aGlobalVariable) => { // <-- call it in the function
  console.log(`${aGlobalVariable} looks tasty.`)
}, aGlobalVariable) // <-- pass it here

确保您了解 async await 和 promises,否则当 运行 这些代码时您最终会遇到奇怪的错误。

这里有一些参考资料。

您可以设置全局变量并在评估函数中访问它们

const p1 = 1;
const  p2 = 2;

nightmare
  .evaluate(
    function (param1, param2) {
      //now we're executing inside the browser scope.
      return param1 + param2;
    },
    p1,
    p2 
  )
  .end();