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

时间:2019-06-04 16:29:42

标签: javascript jestjs nightmare

我不确定这是否是Javascript问题,或者我没有正确使用Nightmare.js。

我正在使用.wait(className)-然后我评估innerHTML中的className。如果我手动添加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,它就可以正常工作。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

似乎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 => {
    // ...
  })