使用phantomjs加载DOM

时间:2016-04-05 05:48:01

标签: javascript phantomjs

我的html网页上有动态加载和应用样式表的javascript。所有内容和渲染都发生在div标签内。这不是加载div标签的内容,它具有id ='tagid'。你知道这里有什么问题吗?我正在使用jquery函数来确保页面已加载。但似乎page.evaluate甚至没有被调用。

我正在使用phantomjs编写单元测试。幻影的新手。请参阅下面的代码段。

page.open(address, function(status){
    console.log('status '+status)
    if(status=='success'){
        console.log('inside status if ')
        page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", function() {
            console.log('after include js ')
            page.evaluate(function(){
                console.log('inside evlaute ')
                $(window).load(function(){
                    console.log(document.getElementById("tagid").innerHTML)

                });
            });

            setTimeout(function(){phantom.exit()},18000)
        })
    }
})

2 个答案:

答案 0 :(得分:1)

您的代码是正确的,但默认情况下console.log调用没有任何效果,因为它发生在PhantomJS页面的上下文中。

您可以使用evaluate调用的返回值,如下所示:

page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", function() {
  console.log('after include js ')
  var tagid = page.evaluate(function(){
    console.log('inside evlaute ')
    return document.getElementById("tagid").innerHTML;
  });

  console.log('Got tag ID: ' + tagId)
  setTimeout(function(){phantom.exit()},18000)
})

或者您可以选择使用onConsoleMessage显示在页面中记录的消息(更复杂的设置):

page.onConsoleMessage = function(msg, lineNum, sourceId) {
  console.log('PAGE CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};

重要提示是PhantomJS和网页的上下文是分开的:在evaluate次调用中,您无法从外部访问变量。实际上,在引用evaluate之前,给予page的回调被转换为字符串。这是PhantomJS中一个非常令人困惑的部分,必须加以考虑。

答案 1 :(得分:0)

您可以尝试在调用evaluate之前给出一些超时。

window.setTimeout(function () {
    page.evaluate(function() {
         console.log(document.getElementById("tagid").innerHTML)
    });
}, 1000 // adjust the time here

要检查phantomjs中正在呈现的内容,您可以使用page.content并检查您的“tagid”元素是否确实存在。