2013-05-31 40 views
29

Uygulamamızın web görüntülerini oluşturmak için bir komut dosyası hazırladım. Mükemmel çalışır ve Ben kırık URL'ye sahip bir görüntü karşılaşmak kadar tüm gayet: Ben sadece sonsuza döngü önce, aşağıda kullanılarak 6 saniye sonra senaryoyu kırmak başarmışphantomJS webpage zaman aşımı

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

.

Fakat, (AKADOM dışarı görüntüsünü almak) ağ isteğini görmezden sonra, görüntü olmadan başparmak oluşturmaya devam etmek mümkündür (veya bir enjekte resim eksik görüntüyle!)

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

Bu mükemmel bir sorudur. Benzer bir problemimiz var, ancak çözülmesi biraz daha zor. Müşterinin web sitesinin, kötü yazılmış özel javascript'i var. Webkit'in asılmasına neden oluyor gibi görünüyor. Test etmek istediğimiz çok sayıda web sitemiz var, ancak bir müşterinin özel js'si webkit'i kırıyorsa işe yaramıyor. Zamanlayıcı obj iyi bir çözümdür, ancak birisinin bir diff çözümü olup olmadığını merak ediyorum. ... – cliffbarnes

cevap

60

PhantomJS 1.9, bir isteğin iptal edilmeden önce ne kadar süre alabileceğini kontrol eden yeni bir ayar olan resourceTimeout'u kullanıma sundu. Bununla birlikte, bir istek zaman aşımına uğradığında/tetiklendiğinde tetiklenen bir onResourceTimeout olayı vardır.

İşte yukarıdaki tüm gösteren bir kod parçacığı var:

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) { 
... 
} 

Maalesef bu seçenekler kötü şu anda belgelenmiştir. Bunları bulmak için GitHub discussions ve PhantomJS source code'dan geçmek zorunda kaldım.

+2

resourceTimeout, çağrılan phantomjs işlemini sonlandırması gerekiyor. Çünkü benim için değil. Phantomjs süreci sadece süresiz olarak askıda kalıyor. – Donato

+0

@Donato Bence resourceTimeout yalnızca 'page.onResourceTimeout' – Scadge

+1

'da ele alınabilecek bir olay oluşturur. En azından 1.9.8 sürümünde olan resourceTimeout işlemi durdurur - bu nedenle PDF bozuktur, ancak işlem askıda kalmaz. Ayrıca hangi kaynağın soruna neden olduğunu yazarak page.onResourceTimeout = function (request) ... – Gerfried