当前位置: 首页 > 面试题库 >

Phantom.js中的setTimeout

闾丘树
2023-03-14
问题内容

下面的代码希望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, 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()

            })
        })
    })
})

替换setTimeout()Meteor.setTimeout()会导致另一个错误:

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

问题答案:

page.evaluate()是PhantomJS的沙盒页面上下文。它无权访问外部定义的变量。如果需要超时,则需要对进行两次调用page.evaluate(),因为您无法从异步函数返回任何内容解释:

page.evaluate(function() {
    ...
    element.dispatchEvent( event );
}, function() {
    setTimeout(function() {
        page.evaluate(function() {    
            return document.documentElement.outerHTML
        }, function(html) {
            doSomething()
        })
    }, 5000)
})

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

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


 类似资料:
  • 问题内容: 我是角度框架的新手。这是我的情况,我想在一段时间后更改$ scope.variable,所以我使用了javascript 方法。 此代码对我不起作用。我曾经使这段代码起作用。 后来我才知道angular本身有一个$ timeout服务,可以完成相同的工作。 如何比较JavaScript服务的性能? 为什么我们应该使用而不是?? 请给我一些示例和使用它的理由,以显示性能。 谢谢 :) 问

  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

  • 问题内容: 我有一个使用该函数并调用另一个方法的方法。在初始加载时,方法2可以正常工作。但是,超时后,我得到一个错误,它是未定义的。我在这里做错了什么? 例如: 问题答案: 问题是导致javascript使用全局范围。本质上,您是在调用类,而不是从中调用。相反,您只是在告诉您使用没有特定作用域的函数。 要解决此问题,您可以将函数调用包装在另一个引用正确变量的函数调用中。它看起来像这样: 可能是因为

  • 问题内容: 我对工作方式有些困惑。我正在尝试在循环中添加一个,以便循环迭代之间相距1秒。每次循环迭代都会发出一个HTTP请求,而另一端的服务器似乎无法在这么短的时间内处理那么多请求。 为什么这不起作用,我如何实现呢? 谢谢 问题答案: 你需要这样的东西 另请参阅此小提琴 此时,您可以致电服务器。请注意,计数器的工作方向相反(递减计数)。我更新了一些注释,说明在哪里可以做您的事情。

  • 我正在尝试返回在setTimout中计算的值。但好像我拿不出这个值。我读到要做到这一点,我必须用promise。我是否必须像下面这样使用它:https://italonascimento.github.io/application-a-timeout-to-your-promissions/?

  • 我已经为android Studio创建了一个webview应用程序。但没有加载web URL。错误为NET::ERR_ACCESS_DENIED。有谁能帮忙吗