表示 querySelector class 的变量未定义 Nightmare.js

Variable representing a class for querySelector is not defined Nightmare.js

我不确定这是 Javascript 问题还是我没有正确使用 Nightmare.js。

我正在使用 .wait(className) - 然后我评估 classNameinnerHTML。如果我手动添加 className 这会起作用。但是,如果我想动态添加 className,则会出现以下错误:

ReferenceError: className is not defined

这发生在 .evaluate() 行。下面的代码示例:

for (const [className, childCount] of pageSections) {
    it(`RENDERS THE ${className} SECTION CHILDREN`, async (done) => {
      RenderHelper.visitPage('/')  // Nightmare method from helper file
        .wait(`${className}`) // This works, dynamically
        .evaluate(() => document.querySelector(`${className}`).innerHTML)
        // Above line is where the className is 'undefined'
        .end()
        .then((result) => {
          RenderHelper.matchChildCount(result, childCount);
          done();
        })
        .catch(done);
    });
  }

只是重复 - 如果我执行上述操作但我手动填充 className,它工作正常。

我在这里错过了什么?

似乎 evaluate() 正在破坏使 className 的使用无效的执行上下文。要解决此问题,请遵循 evaluate() 方法说明中的指南并将 className 传递到回调中。

改变

.evaluate(() => document.querySelector(`${className}`).innerHTML)

.evaluate(className => return document.querySelector(className).innerHTML)

文档遵循此方法:https://github.com/segmentio/nightmare#evaluatefn-arg1-arg2

注意本例中 selector 的使用:

const selector = 'h1'
nightmare
  .evaluate(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
  .then(text => {
    // ...
  })