2013-05-31 81 views
29

我已经设置了一个脚本来创建我们的应用程序的网页截图。 它完美地运行,直到我遇到一个像一个破碎的URL所有的罚款:phantomJS网页超时

"<img src='http://testserver.our.intranet/fetch/image/373e8fd2339696e2feeb680b765d626e' />" 

我已成功地打破了脚本中使用低于6秒后,它只是循环永远之前。

但是,是否有可能忽略网络请求(AKA取出来的图像的DOM),然后进行无图像创建拇指,(或注入的图像丢失的形象!)

var page = require('webpage').create(), 
    system = require('system'), 
    address, output, size; 

if (system.args.length < 3 || system.args.length > 5) { 
    phantom.exit(1); 
} else { 
    address = system.args[1]; 
    output = system.args[2]; 
    page.viewportSize = { width: 640, height: 640 }; 
    page.zoomFactor = 0.75; 
    page.clipRect = { top: 10, left: 0, width: 640, height: 490 }; 
    try{ 
     page.open(address, function (status) { 
      if (status !== 'success') { 
       console.log('Unable to load the address!'); 
       phantom.exit(); 
      } else { 
       window.setTimeout(function() { 
        page.render(output); 
        phantom.exit(); 
       }, 200); 
      } 
     });  
    } finally{ 
     setTimeout(function() { 
      console.log("Max execution time " + Math.round(6000) + " seconds exceeded"); 
      phantom.exit(1); 
     }, 6000); 
    } 
} 
+0

这是一个很好的问题。我们有一个类似的问题,除了有点难以解决。我们有一个客户的网站,它的自定义JavaScript写得不好。这似乎是导致webkit挂起。我们有大量想要测试的网站,但如果客户的自定义js正在破坏webkit,则它不起作用。计时器OBJ是一个很好的解决方案,但我想知道是否有人有差异解决方案。 ...? – cliffbarnes

回答

60

PhantomJS 1.9推出了一个新的设置,resourceTimeout,它控制了请求在被取消前可以持续多久。除此之外,还有一个onResourceTimeout事件在请求超时时触发。

这里的说明上述所有的代码片段:

var page = require('webpage').create(); 
page.settings.resourceTimeout = 5000; // 5 seconds 
page.onResourceTimeout = function(e) { 
    console.log(e.errorCode); // it'll probably be 408 
    console.log(e.errorString); // it'll probably be 'Network timeout on resource' 
    console.log(e.url);   // the url whose request timed out 
    phantom.exit(1); 
}; 

page.open('http://...', function (status) { 
... 
} 

不幸的是这些选项的不良记录现在。我必须通过GitHub discussionsPhantomJS source code才能找到它们。

+2

resourceTimeout应该终止被调用的phantomjs进程。因为对我而言,事实并非如此。 phantomjs流程只能无限期地挂起。 – Donato

+0

@Donato我认为resourceTimeout只产生一些事件,可以在'page.onResourceTimeout'中处理 – Scadge

+1

至少在版本1.9.8中resourceTimeout中断了进程 - 所以PDF被破坏,但进程没有挂起。我还通过使用page.onResourceTimeout = function(request)来记录哪个资源导致了问题... – Gerfried