PhantomJS передать аргумент для оценки

У меня есть небольшое тестовое приложение, использующее NightmareJS в качестве оболочки для PhantomJS. Я хочу проверить наличие класса для элемента. У меня есть этот код:

new Nightmare()
  .goto(baseURL)
  .evaluate(function() {
    return document.querySelector('body');
  }, function(element) {
    element.className.should.equal(expected)
    callback();
  })
  .run();

Как передать аргумент методу querySelector, а не жестко закодировать тег?

я пытался

var tag = body;
new Nightmare()
      .goto(baseURL)
      .evaluate(function() {
        return document.querySelector(tag);
      }, function(element) {
        element.className.should.equal(expected)
        callback();
      })
      .run();

Однако PhantomJS всегда возвращает ошибку, что он не может найти переменную.

Как выполнить передачу аргумента переменной в метод querySelector?

1 ответ

Решение

PhantomJS имеет два контекста. Контекст DOM (или контекст страницы) находится в изолированной программной среде и доступен только через evaluate(), evaluate() принимает функцию, которая оценивается на странице, поэтому код внутри не может ссылаться на какие-либо переменные или функции, которые определены вне ее.

Подпись Кошмара evaluate() Функция заключается в следующем:

function evaluate(func, callback/**, arg1, arg2...*/)

Это означает, что дополнительные значения могут быть переданы непосредственно в функцию в качестве дополнительных аргументов. func, callbackа также arg1,arg2,... передаются через фантомный узел(который используется Nightmare для фактического взаимодействия с PhantomJS) и func, arg1, arg2... затем передаются в PhantomJSevaluate(),

Примечание. Аргументы и возвращаемое значениеevaluateФункция должна быть простым примитивным объектом. Эмпирическое правило: если его можно сериализовать через JSON, то это нормально.

Замыкания, функции, DOM-узлы и т. Д. Не будут работать!

Правильное использование будет:

var tag = "body";
new Nightmare()
  .goto(baseURL)
  .evaluate(function(innertag) {
    return document.querySelector(innertag).className;
  }, function(className) {
    className.should.equal(expected);
    callback();
  }, tag)
  .run();
Другие вопросы по тегам