2016-04-05 4 views
1

Benim html web sayfam dinamik olarak stil sayfalarını yükleyen ve uygulayan bir javascript içeriyor. Tüm içerik ve oluşturma, bir div etiketinin içinde gerçekleşir. Bu, id = 'tagid' olan div etiketinin içeriğini yüklemiyor. Burada neyin yanlış olduğunu biliyor musun? Sayfanın yüklü olduğundan emin olmak için jquery işlevini kullanıyorum. Ama sayfa.evaluate denir bile görünüyor.loading DOM kullanarak phantomjs

phantomjs kullanarak birim testleri yazıyorum. Phantom'lara yeni. Aşağıdaki kod pasajına bakın.

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) 
     }) 
    } 
}) 
+0

Sayfa yüklendikten sonra '$ (window) .load (...)' ifadesi anlamsızdır. Geri arama asla çağrılmayacak. –

cevap

0

Değerlendirmeyi çağırmadan önce biraz zaman aşımı vererek deneyebilirsiniz. içerik phantomjs içinde oluşturulmakta olan neyi kontrol etmek

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

, sen page.content kullanmak ve "TagId" unsurunun gerçekten varsa orada kontrol edebilirsiniz.

+0

teşekkürler Artjom. Tagid elementi var gibi görünüyor, ancak phantomjs için hiçbir içerik görünmüyor. Ancak sayfayı yüklemek için chrome geliştirici araçlarını kullandığımda .. İçeriğin işlendiğini görüyorum. Tagid içeriği, çalışma zamanında html'de oluşturulur. Ne olabilirdi? – jack

1

Kodunuz doğru, ancak console.log aramasının PhantomJS sayfasının içeriğinde olduğu gibi varsayılan olarak herhangi bir etkisi yoktur.

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

Yoksa onConsoleMessage (daha karmaşık kurulum) kullanarak sayfa kaydedilir mesajları görüntülemeyi seçebilirsiniz:

aşağıdaki şekilde evaluate çağrısının dönüş değerini kullanabilirsiniz ya

evaluate aramalar içeride, dışarıda değişkenleri erişemez:
page.onConsoleMessage = function(msg, lineNum, sourceId) { 
    console.log('PAGE CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")'); 
}; 

önemli bir not PhantomJS ve sayfanın içeriği ayrı olmasıdır. Aslında, kaputun altında, evaluate'a verilen geri arama, page'a verilmeden önce bir dizgeye dönüştürülür. Bu düşünülmesi gereken PhantomJS çok kafa karıştırıcı bir parçasıdır.

+0

Teşekkürler blint. Tagid'i değerlendirme işlevine döndürmeyi denedim. Ama bu biraz hata veriyor gibi görünüyor. Konsol çıkışı aşağıdaki gibidir: ------------------------------------------- durum başarı durum içinde ise sonra js TypeError aşağıdakiler bulunmaktadır: 2 : boş bir nesne tanımlanmamış (değerlendirmek. 'document.getElementById ("TagId") innerHTML') -------- ------------------------------------------ – jack

+0

Hiç öğeniz yok gibi görünüyor sayfanızda id 'tagid' (değerlendirme anında = sayfanın yüklenmesinden hemen sonra). Bu öğe bir betik tarafından daha sonra işlenirse, sonraki adımlara geçmeden önce # tagid'in DOM'a eklendiğinde düzenli olarak denetlemek için 'setInterval 'kullanabilirsiniz. – blint