Переменная, представляющая класс для querySelector, не определена Nightmare.js - PullRequest
0 голосов
/ 04 июня 2019

Я не уверен, что это проблема с 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 Ответ

1 голос
/ 04 июня 2019

Кажется, 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 => {
    // ...
  })
...