当我运行一次评估时,NightmareJS运行良好,但当我与页面交互时,我需要做更多的评估。然而,使用文档我尝试了一个链接评估的简单示例,我收到一个错误:
lobal-css:
css:
theme:
css/bootstrap.css: {}
css/font-awesome.css: {}
css/responsive-menu.min.css: {}
css/style.css: {}
global-js:
js:
js/bootstrap.js: {}
js/jquery.singlePageNav.min.js: {}
js/responsive-menu.js: {}
js/customscript.js: {}
dependencies:
- core/jquery
错误:
TypeError:nightmare.goto(...)。wait(...)。type(...)。click(...)。wait(...)。evaluate(...)。then (...)。等待不是一个功能
在这种情况下,我在下一次评估之前添加了一个等待,以防我需要让系统等待完成,但仍然无法正常工作。
答案 0 :(得分:7)
问题是evaluate()
会返回Promise,这是一个Javascript的东西而不是梦魇。
所以Promise有then
和catch
等方法,但显然没有wait
方法。
我感谢this回答,这resource可以帮助您更好地理解这个概念。
将概念应用于您的场景,代码将如下所示
describe('test google search results', function() {
this.timeout(15000);
it('should find the nightmare github link first', function(done) {
var nightmare = Nightmare({show: true})
nightmare
.goto('http://google.com')
.wait(1000)
.type('form[action*="/search"] [name=q]', 'github nightmare')
.click('form[action*="/search"] [type=submit]')
.wait(1000)//.wait('#rcnt')
.evaluate(function () {
return document.querySelector('div.rc h3.r a').href
})
.then(function(link) {
console.log("TESTING 1");
expect(link).to.equal('https://github.com/segmentio/nightmare');
nightmare.evaluate(function () {
return document.querySelector('div.rc h3.r a').href
})
.end()
.then(function(link) {
console.log("TESTING 2");
expect(link).to.equal('https://github.com/segmentio/nightmare');
done();
})
}).catch(function(error) {
done(new Error(error))
})
});
});
请注意对evaluate
的第二次调用是如何在第一个then
回调中进行的。