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

Cerrado
Noelia - Modificado el 14 oct 2020 a las 11:48
Irene Burn Mensajes enviados 449 Fecha de inscripción miércoles, 2 de septiembre de 2020 Estatus Administrador Última intervención jueves, 24 de marzo de 2022   - 14 oct 2020 a las 18:11
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?
Consulta también:

1 respuesta

Irene Burn Mensajes enviados 449 Fecha de inscripción miércoles, 2 de septiembre de 2020 Estatus Administrador Última intervención jueves, 24 de marzo de 2022   233
14 oct 2020 a las 18:11
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!


Irene Burn

Redactora - CCM en Español

2