2013-07-24 29 views
7
Ben CasperJS test etmek çalışıyorum ve böyle bir ızgara düzeni olan bir siteniz kazıma

: Ben CasperJS kullanmıyor iseyineleme

|Name  |Name  | 
|Title  |Title  | 
|Image  |Image  | 
|Something |Something | 
|---------------------- 
|Name  |Name  | 
|Title  |Title  | 
|Image  |Image  | 
|Something |Something | 
|---------------------- 

tüm listesini almak istiyorum İçerdiği (4 i bu durumda) ve sonra her bir kapsayıcıda istenen özelliklere sahip bir nesne alabilen bir yöntem çalıştırın.

CasperJS'de bunu yapmakta zorlanıyorum. İlk olarak casper.evaluate (function() {....}) içindeki DOM öğelerinin listesini döndürmeye çalıştım ancak DOM öğelerini geri dönemez.

Ardından, istenen nesneleri (4) bir diziye iten ve bunu bir Değerlendirmeye döndüren her bir döngü yapmayı denedim, ancak boş bırakmaya devam ediyor. CasperJS'de böyle bir şey yapmak nasıl olur? Bir konteynerin bir bağlamını bir yönteme geri getirebilir miyim, bu da nesneyi nesnelerin toplanmasını geri döndüren ana değerlendirmeye geri döndürür mü?

+1

Başınızı Casper'ın ana konseptine karşı vuruyorsunuz. Sunucu ve istemci JS arasındaki ayrım. Değerlendirmenin dışında, yalnızca sunucu, DOM yok. Köprü, seri hale getirilebilir nesnelerdir. İki cevap bunu iyi açıklıyor. Örnekte getLinks işlevinin nasıl bir dizi dizi döndürdüğüne dikkat edin. DOM nodes.http: //docs.casperjs.org/en/latest/quickstart.html –

cevap

9

Maalesef evaluate() işlevinden karmaşık bir yapısı alamayan kullanılarak istenilen nesnenin serileştirilmiş sürümünü döndürür.

Ancak başka bir tür nesneyi iletemeyeceğiniz anlamına gelmez. İşte

casper.evaluate() gelen nesnelerle dizisini almak konusunda bir örnek: Ben web bağlam JQuery kütüphanesini içerdiğini tahmin ediyorum

var arrayResult = this.evaluate(function getGridResuls(){ 

    //create array 
    var arrayObjects = new Array(); 

    //Iterates over table (grid) elements 
    jQuery("table.results").each(function(index) { 

     //get table (grid) 
     var tableResult = jQuery(this); 

     //create basic object  
     objResult = new Object(); 

     //fill object properties 
     objResult.name  = tableResult.find('selector to get name').text(); 
     objResult.title  = tableResult.find('selector to get title').text(); 
     objResult.image  = tableResult.find('selector to get image info').text(); 
     objResult.something = tableResult.find('selectot to get something').text().trim(); 

     //assign object to array 
     arrayObjects[index] = objResult; 

    }); 

    //return array with objects 
    return arrayObjects; 

}); 

... 
//do something with arrayResult 

.

İpucu: beklendiği gibi js kodu çalıştığından emin olmak için tarayıcı konsolunu kullanarak evaluate() fonksiyonun js kodunu çalıştırmayı deneyin.

2

Yaklaşım doğrudur, ancak değerlendirme kum havuzudur. Ayrıca, argüman ve değerlendirme fonksiyonuna dönüş değeri basit bir ilkel nesne olmalıdır, ancak JSON üzerinden serileştirilebiliyorsa, o zaman iyi olur. Kapanışlar, fonksiyonlar, DOM düğümleri, vb çalışmayacak! evaluate() geçirilen her ne arg JSON.parse(JSON.stringify(arg)) tür olduğu için yerine istenilen nesneyi döndürme

, JSON.stringify()

+0

Cevabınız için teşekkürler, ancak daha sonra nasıl DRY yaparsınız. Bir DOM bağlamı alabilen ve bir JSON nesnesini (stringified) döndüren bir yönteme sahip olurdum. Kum havuzundaki işlevleri arayabilir miyim ve o zaman DOM öğesini geri alabilir miyim? Temel olarak sadece bir kapsayıcı üzerinde en iyi çözümün ne olduğunu bulmak ve CasperJS'de bu kapsayıcıdan öğeleri almak istiyorum. – Dofs

+0

@dofs değerlendirmenin dışında DOM yok, bunu yapamazsın. Öğelerinizi basit seri hale getirilebilir nesnelere soyutlamanız gerekiyor –