我有一个小型测试应用程序使用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方法?
答案 0 :(得分:7)
PhantomJS有两个上下文。 DOM上下文(或页面上下文)是沙箱,只能通过evaluate()
访问。 evaluate()
接受在页面中计算的函数,因此其中的代码不能引用在其外部定义的任何变量或函数。
signature of Nightmare's evaluate()
function如下:
function evaluate(func, callback/**, arg1, arg2...*/)
这意味着其他值可以作为附加参数直接传递给函数。 func
,callback
和arg1
,arg2
,...通过phantomjs-node(Nightmare用来实际与PhantomJS交互)和{{然后将1}},func
,arg1
,...传递给PhantomJS's evaluate()
。
注意:
arg2
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!
正确用法是:
evaluate