[caracas-pm] Leer resultados AJAX desde Mech

Alejandro Imass ait at p2ee.org
Mon Aug 12 07:07:51 PDT 2013


2013/8/12 Alberto Mijares <amijaresp at gmail.com>:
> 2013/8/11 Alejandro Imass <ait at p2ee.org>:
>> 2013/8/11 Alberto Mijares <amijaresp at gmail.com>:
>>> Hola lista:
>>>
>>> Estoy escribiendo un scraper en perl con WWW::Mechanize::Firefox. Todo
>>> va bien hasta que me encuentro un formulario con AJAX.
>>>

[...]

>
>
> Gracias, Alejandro.
>
> Efectivamente, hay que darle unos segundos para que obtenga una
> respuesta; es decir, después de hacer la selección en el primer campo,
> se actualizan los posibles valores del segundo y todo se refleja en el
> HTML. Solo hay que darle un par de segundos para que se actualice el
> contenido.
>

Que bueno que eso era todo. Recuerda que el rendimiento va a variar en
función del tráfico. Los waits fijos son frágiles y los mejor es lazos
que esperen con un sleep(1) intercalado. Algo como:

# repetir por cada AJAX
for(1..5){
  sleep(1);
  break if [cond];
}
die "Timed our waiting for X" unless [cond];

[cond] puede ser cualquier de $mech->events(), $mech->on_event(), o un
eval on page usando un JS que determine si el evento está listo o no
(e.g. en tu caso contar el número de opciones de la segunda lista con
un pequeño script on the fly).

También te puedes poner creativo pr eventos con $mech->synchronize(
$event, $callback ), no obstante yo no lo he usado.

Selenium tiene una serie de funciones que no he visto en Mech Firefox
por ejemplo:

wait.until(presenceOfElementLocated(By.id("dashboard_control"));

Que es muy similar a lo que te digo arriba, pero si encuentras algo
parecido arriba o alguna forma de hacerlo más sencillo, compartela con
la lista!

Saludos,

-- 
Alejandro Imass


More information about the caracas-pm mailing list