我不确定这是否是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
,它就可以正常工作。
我在这里想念什么?
答案 0 :(得分:1)
似乎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 => {
// ...
})