首页 > 解决方案 > 未定义代表 querySelector 类的变量 Nightmare.js

问题描述

我不确定这是 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手动填充,它工作正常。

我在这里想念什么?

标签: javascriptjestjsnightmare

解决方案


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

推荐阅读