Puppeteer sharp - ejecutar función del javascript de la pág. y get div con resul

Denunciar
-
Message postés
1
Date d'inscription
miércoles, 2 de septiembre de 2020
Estatus
Administrador
Última intervención
miércoles, 14 de octubre de 2020
-
Hola,

estoy intentando hacer varias pruebas con Puppeteer sharp porque es la primera vez que trabajo con ello pero creo que no me queda muy claro su sintaxis para lo que necesito.

Os cuento, tengo que abrir una página que tengo en un servidor, y luego ejecutar de esa página una función javascript (cargarDatosPagina ('4', true)) que tengo definida la cual puede durar unos 15 min en terminar y cuando lo hace rellena una etiqueta div ( ) que está en esa página. Yo necesito que hasta que no se rellene ese div (vamos que hasta que no se ejecute y termine la función javascript) no me pase a otra instrucción, pero no me sé la sintaxis a usar. ¿Me podríais ayudar? ¿qué tengo que poner para poder obtener el contenido del div resultadoDIV?

Yo estaba usando algo tal

using (var browser = await Puppeteer.LaunchAsync(options))
using (var page = await browser.NewPageAsync())
{
await page.GoToAsync("http://.../mipagina.aspx");
page.DefaultNavigationTimeout = 100000;
try
{
string funcionEjecutar = "cargarDatosPagina ('4', true)";
var res = await page.EvaluateExpressionAsync(funcionEjecutar); //funciona pero no espera a que termine de ejecutarse la función y yo necesito que me devuelva el contenido del div
}
catch(){
}

Muchas gracias?

1 respuesta

Message postés
1
Date d'inscription
miércoles, 2 de septiembre de 2020
Estatus
Administrador
Última intervención
miércoles, 14 de octubre de 2020
18
Buenas tardes Noelia,

Se me ocurren un par de posibles soluciones:

Tienes que tener en cuenta que en Puppeteer Sharp, como no podemos utilizar código de JavaScript nativo, todo se representa como un string. Por lo tanto, para expresiones como "3 + 4" sería correcto emplear EvaluateExpressionAsync, pero para funciones del tipo "async () => await window.nextGraphic()" o "() => 3 + 4" se debe utilizar EvaluateFunctionAsync. Te aconsejaría que probases con esta última opción.

En cualquier caso, si lo que estás empleando es una expresión, la manera recomendada por la documentación oficial de evaluar async es la siguiente (lo muestro con un ejemplo):

var someObject = await page.EvaluateExpressionAsync<string[]>(expression);


Por tanto, aconsejaría que en tu código añadieses el tipo de dato que devuelve la expresión a la que haces referencia: int, string, dynamic...etc. Empleando, por ejemplo dynamic en tu código:

var res = await page.EvaluateExpressionAsync<dynamic>("expresionEjecutar");


También te recomiendo que visites la documentación oficial de la librería que utilizas aquí en donde puedes encontrar ejemplos que te pueden ayudar como este.

¡Espero haberte servido de ayuda!


2
Gracias

¡Estamos felices de haberte ayudado! ¿Te hemos sido de ayuda? ¡Déjanos un comentario! Evalúa a CCM

CCM 35558 usuarios nos han dicho gracias este mes