javascript – setTimeout在Phantom.js

下面的代码想要Phantom.js加载页面,点击一个按钮,等待5秒钟返回页面HTML代码.

问题:但是使用setTimeout()创建5秒延迟会导致
page.evaluate函数返回null到回调函数而不是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,window,1,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()会导致另一个错误

phantom stdout: ReferenceError: Can't find variable: Meteor

解决方法

page.evaluate()是PhantomJS的沙盒页面上下文.它无法访问外部定义的变量.如果需要超时,则需要对page.evaluate()进行两次调用,因为您无法从异步函数( explanation)返回任何内容
page.evaluate(function() {
    ...
    element.dispatchEvent( event );
},function() {
    setTimeout(function() {
        page.evaluate(function() {    
            return document.documentElement.outerHTML
        },function(html) {
            doSomething()
        })
    },5000)
})

而不是使用第二个page.evaluate()调用,您可以通过直接访问定义的内容来缩短代码here

setTimeout(function() {
    page.get("content",function(content) {
        doSomething()
    })
},5000)

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ "TOC" 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...