问题描述
下面的代码希望 Phantom.js 加载页面,点击按钮并等待 5 秒钟,然后返回页面的 HTML 代码.
The code below wants Phantom.js to load the page, click on a button and wait for 5 seconds before returning the page's HTML code.
问题:但是使用 setTimeout()
来创建 5 秒延迟会导致page.evaluate
函数将 null
返回给回调函数而不是 HTML.
Problem: However using setTimeout()
to create the 5 seconds delay causes thepage.evaluate
function to return null
to the callback function instead of the HTML.
myUrl = 'http://www.google.com'
var phantom = Meteor.npmRequire('phantom')
phantom.create = Meteor.wrapAsync(phantom.create)
phantom.create( function(ph) {
ph.createPage = Meteor.wrapAsync(ph.createPage)
ph.createPage(function(page) {
page.open = Meteor.wrapAsync(page.open)
page.open(listingUrl, function(status) {
console.log('Page loaded')
page.evaluate = Meteor.wrapAsync(page.evaluate)
page.evaluate(function() {
// Find the button
var element = document.querySelector( '.search-btn' );
// create a mouse click event
var event = document.createEvent( 'MouseEvents' );
event.initMouseEvent( 'click', true, true, window, 1, 0, 0 );
// send click to element
element.dispatchEvent( event );
// Give page time to process Click event
setTimeout(function() {
// Return HTML code
return document.documentElement.outerHTML
}, 5000)
}, function(html) {
// html is `null`
doSomething()
})
})
})
})
用 Meteor.setTimeout()
替换 setTimeout()
会导致另一个错误:
Replacing setTimeout()
with Meteor.setTimeout()
causes another error:
phantom stdout: ReferenceError: Can't find variable: Meteor
推荐答案
page.evaluate()
是 PhantomJS 的沙盒页面上下文.它无法访问外部定义的变量.如果您需要超时,那么您需要对 page.evaluate()
进行两次调用,因为您无法从异步函数返回任何内容(说明):
page.evaluate()
is the sandboxed page context of PhantomJS. It has no access to variables defined on the outside. If you need the timeout, then you need to do two calls to page.evaluate()
, because you cannot return anything from a asynchronous function (explanation):
page.evaluate(function() {
...
element.dispatchEvent( event );
}, function() {
setTimeout(function() {
page.evaluate(function() {
return document.documentElement.outerHTML
}, function(html) {
doSomething()
})
}, 5000)
})
您可以通过直接访问定义的内容来缩短代码,而不是使用第二个 page.evaluate()
调用这里:
Instead of using the second page.evaluate()
call, you may shorten the code by directly accessing the content as defined here:
setTimeout(function() {
page.get("content", function(content) {
doSomething()
})
}, 5000)
这篇关于Phantom.js 中的 setTimeout的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!