4
page.open(My_url, function(status) {
                        page.evaluate(function() { 
                            var html = document.documentElement.outerHTML;
                            return html;
                        }, function(result){
                            res.send(result);
                        });
                    });

我有一个 Backbone 应用程序。“My_url”指向那个主干页面。

当我运行此代码时,outerHTML 不包含呈现的视图。它只有基本的 css/scripts/container holder。

就像 Backbone 应用程序根本没有运行一样。如何让 evaluate() 返回完全渲染的 Backbone 应用程序(在所有 ajax 调用和其他东西之后)?

毕竟,这就是 Phantom.js 的重点

4

1 回答 1

6

在页面加载后立即评估页面并不总是足够的。有时,由于 JavaScript 在页面上的编写方式,您必须等待并允许页面的 JavaScript 执行。为此,我建议您在执行评估之前尝试添加等待。例如

function ( status ) {
  if ( status === 'fail' ) {
    phantom.exit( 1 );
    return; // essential, if you don't, below will be executed
  }

  window.setTimeout(
    function () {
      var result = page.evaluate(
        function () {
          var html = document.documentElement.outerHTML;
          return html;
        }
      );
      res.send( result );
    },
    1000 // wait 1,000ms (1s)
  );
}

如果您发现有必要等待,那么您可能想要等待某事。为此,请waitFor在 Internet 上寻找一个或类似的功能,该功能将允许您的脚本不断轮询,直到出现特定的 DOM 元素。

于 2013-05-23T08:40:31.703 回答