2012-03-16 14 views
7

Ben sadece PhantomJs alışmak ve şimdiye kadar gerçekten çok serin.PhantomJs linklere tıklamak veya sayfa üstü fonksiyonlar çalıştırmak

Bir siteyi taramaya ve sitede bulunan ürünlerle ilgili verileri almaya çalışıyorum. Her ürün sayfası görünür ürünün varsayılan rengiyle birlikte yüklenir. Renk örneğini tıkladığınızda, bir işlevi çalıştırarak yeni rengi değiştirir. Her tıklanabilir Renk skalası öğesi şöyle görünür:

<input type="image" id="swatch_0" onclick="pPage.getColor(0);" src="http://www.site.com/img50067.jpg"> 

getColor o renk için küçük resmini ve fiyatını günceller. Kullanılabilir her renk için id artışları (swatch_0, swatch_1, vb.) Ve argüman da getColor artışlarına geçirilir. Ben PhantomJs ile her bir renk boyunca yinelemek ve her biri için ilgili verileri çekmek istiyorum.

Sayfayı yükledim, jQuery yükledim ve verileri tam olarak yüklenen renk için çekebiliyorum, ancak hiçbir şey tıklama olayları yürütmeme izin vermiyor.

page.evalaute(function){ 
    var selection = $('#confirmText').text(); // name of the color 
    var price = $('#priceText').text();  // price for that color 

    console.log('Price is: ' + price); 
    console.log('Selection is: ' + selection); 
    console.log($('#swatch_1')); 

    $('#swatch_1').trigger("click"); 

    selection = $('#selectionConfirmText').text(); 
    price = $('#priceText').text(); 
    console.log('Price is: ' + price); 
    console.log('Selection is: ' + selection); 

} 

Bu bana verir:

console> Price is: $19.95 
console> Selection is: blue 
console> [Object Object] 
console> TypeError: 'undefined' is not and object // repeating until I manually exit 

başka hiçbir kod çalıştırır burada

deniyorum budur.

var evt = document.createEvent("MouseEvents"); 
evt.initMouseEvent("click", true, true, window, 
0, 0, 0, 0, 0, false, false, false, false, 0, null); 
var cb = document.getElementById("swatch_1"); 
cb.dispatchEvent(evt); 

Ve işlevi doğrudan çalışan: Ben de böyle jQuery olmadan olay ateş denedim

pPage.getColor(1); 

Ve aynı çıktı elde edin. Herhangi bir yardım takdir edilir. onclick işleyicisi buradan sahip olarak HTML doğrudan belirtildiğinde

cevap

3

varsa, JavaScript ile doğrudan arayabilirsiniz:

$(function() { 
    $('#swatch_0')[0].onclick(); 
}); 

Ben de sorunu PhantomJS page yöntemi sendEvent() kullanabilirsiniz inanıyoruz bir yerel tıklama etkinliği. Ama bu biraz karmaşık, sanki PhantomJS içeriğinden farenin x, y pozisyonu ile söylemek zorundasınız gibi görünüyor. Test edilmemiş kod: Birkaç ay burada

var elementOffset = page.evaluate(function() { 
    return $('#swatch_1').offset(); 
}); 
page.sendEvent('click', elementOffset.left + 1, elementOffset.top + 1); 
+0

Eğer onClick bir jQuery olaydır eminiz bir parçası değil yapmalıdır? Bu konuyla ilgili belgeleri bulamıyorum. Anladığım kadarıyla .click() olayı öğeye bağlayacaktır, ancak yine de tıklamanız gerekir. SendEvent'i denemedim. Bu umut verici görünüyor. Bu özel proje için farklı bir rotaya gitmeye karar verdim. Sayfa verilerini kazımak için iMacros kullanıyorum. Gerçek bir tarayıcı kullanır, bu yüzden Ajax ve Javascript bir sorun değildir. Teşekkürler! –

+0

'onclick' jQuery olayı değildir - DOM öğesinde yerel bir yöntemdir (bu benim örneğimin anlamı $ (...) [0].onclick' - '[0]', bir jQuery nesnesi değil, gerçek DOM öğesini alır. Bu pek çok durumda işe yaramaz, ancak HTML biçimlendirmesinde "onclick" bulunduğunda çalışır. – nrabinowitz

+2

BTW - Bu tür tarayıcı tabanlı kazıma işlemleri için Selenium'u da düşünebilirsiniz. Oldukça iyi, gerçek bir tarayıcı kullanıyor ve bir sürü başka dil için bağlayıcılar var. – nrabinowitz

1

pek aktivite, ama son zamanlarda bu şeylerle çalışıyoruz ve jquery zaten bir parçası olarak yüklenir ise belki bu soruya

bir cevaptır Çalıştığınız sayfa, daha sonra jquery'nin enjekte edilmesi işe yaramaz, tanımladığınız davranışı alırsınız (bunu ben de gördüm). Eğer jQuery kod enjekte zaman

Yani önce emin zaten bağlamda

İlgili konular