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.
¿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! –
'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
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