2012-03-16 11 views
7

Me estoy acostumbrando a PhantomJs y hasta ahora es genial.PhantomJs haciendo clic en enlaces o ejecutando funciones en la página

Estoy tratando de rastrear un sitio y obtener datos sobre los productos en el sitio. Cada página de producto se carga con el color predeterminado del producto visible. Cuando hace clic en una muestra de color, intercambia el nuevo color ejecutando una función. Cada elemento de la muestra del color se puede hacer clic se ve así:

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

getColor actualiza la miniatura y el precio de ese color. Los incrementos de id para cada color disponible (swatch_0, swatch_1, etc.) y el argumento pasado a getColor también aumentan. Quiero iterar a través de cada color con PhantomJs y extraer los datos relevantes para cada uno.

He cargado la página, he cargado jQuery, y puedo extraer los datos para el color cargado inicialmente, pero nada parece permitirme ejecutar eventos de clic.

aquí es lo que estoy tratando:

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

} 

Esto me da:

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

ningún otro código se ejecuta. También he intentado disparar el evento sin jQuery así:

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

y ejecutar la función directamente:

pPage.getColor(1); 

Y me da la misma salida. Cualquier ayuda es apreciada.

Respuesta

3

Si se especifica el manejador onclick directamente en el HTML como lo tienes aquí, se le puede llamar directamente con Javascript:

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

Creo que también puede utilizar los PhantomJS page método para emitir sendEvent() un evento de clic nativo. Pero parece que esto es un poco complicado, ya que tiene que llamar esto desde el contexto PhantomJS con la posición x, y del mouse. código no probado:

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

¿está seguro onClick es un evento jQuery? No puedo encontrar documentación al respecto. Tengo entendido que .click() vinculará el evento al elemento, pero igual tendría que hacer clic en él. No he probado sendEvent. Eso parece prometedor. Para este proyecto específico, decidí tomar una ruta diferente. Estoy usando iMacros para raspar datos de página. Utiliza un navegador real, por lo que Ajax y Javascript no son un problema. Gracias! –

+0

'onclick' no es un evento jQuery - es un método nativo en el elemento DOM (es por eso que mi ejemplo usa' $ (...) [0].onclick' - el '[0]' obtiene el elemento DOM real, no un objeto jQuery). Esto no funcionará en muchas circunstancias, pero funciona cuando 'onclick' está incluido en el marcado HTML. – nrabinowitz

+2

BTW - también podría considerar Selenium para este tipo de raspado basado en navegador. Es bastante bueno, también usa un navegador real y tiene enlaces para muchos otros idiomas. – nrabinowitz

1

no mucha actividad aquí por unos pocos meses, pero he estado trabajando con estas cosas últimamente y tal vez esta es una respuesta a su pregunta

si jQuery ya está cargado como parte de la página que está ejecutando, y luego inyectar jquery no funcionará, obtendrá el comportamiento que describe (esto también lo encontré).

Así que cuando se inyecta el código jQuery que primero debe asegurarse de que no es ya parte del contexto

Cuestiones relacionadas