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();