NightmareJS 多重评估
NightmareJS multiple evaluations
当我进行 运行 一次评估时,NightmareJS 工作得很好,但是当我与页面交互时,我需要在事情通过时进行更多评估。但是,使用文档我尝试了一个简单的链接评估示例,但出现错误:
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');
})
.wait()
.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();
})
});
});
错误:
TypeError: nightmare.goto(...).wait(...).type(...).click(...).wait(...).evaluate(.. .).then(...).wait 不是函数
在这种情况下,我在下一次评估之前添加了一个等待时间,以防我需要让系统等待完成但仍然无法正常工作。
事情是 evaluate()
returns 一个 Promise,这是 Javascript 的事情而不是梦魇的事情。
所以 Promise 有 then
和 catch
等方法,但显然没有 wait
方法。
I thing this answer and 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
回调中进行的。
当我进行 运行 一次评估时,NightmareJS 工作得很好,但是当我与页面交互时,我需要在事情通过时进行更多评估。但是,使用文档我尝试了一个简单的链接评估示例,但出现错误:
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');
})
.wait()
.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();
})
});
});
错误:
TypeError: nightmare.goto(...).wait(...).type(...).click(...).wait(...).evaluate(.. .).then(...).wait 不是函数
在这种情况下,我在下一次评估之前添加了一个等待时间,以防我需要让系统等待完成但仍然无法正常工作。
事情是 evaluate()
returns 一个 Promise,这是 Javascript 的事情而不是梦魇的事情。
所以 Promise 有 then
和 catch
等方法,但显然没有 wait
方法。
I thing this answer and 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
回调中进行的。