Compruebe si la página de PowerBI está cargada (usando Selenium)

Un usuario Pregunto ✅

knyazs

¡Hola!

Estoy usando Selenium para automatizar las pruebas de carga y rendimiento de los informes de PowerBI y necesito una forma confiable de pausar la ejecución del código hasta que la página esté completamente cargada (todas las consultas ejecutadas y todas las segmentaciones y gráficos mostrados). Muchas páginas en Google sugirieron que debería usar los siguientes códigos JavaScript para lograrlo:

  • devuelve jQuery.active == 0
  • volver document.readyState == «completo»

Pero esto no funciona para mí ya que ambas líneas siempre se verifican como verdaderas y el código continúa ejecutándose aunque puedo ver que el gráfico no se ha dibujado.

La única forma en que podría hacerlo funcionar es obtener XPaths de todos los elementos del informe (segmentaciones, gráficos, etc.) y esperar a que todos esos elementos «se vuelvan» visibles:

public void waitUntilReportProcesses(IWebDriver driver)
{
	WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(600.00));
	var xpaths = new string[]
	{
		"//*[@id="pvExplorationHost"]/div/div/div/div[1]/div[2]/div[3]/div[2]/div[2]", // chart 1
		"//*[@id="pvExplorationHost"]/div/div/div/div[1]/div[2]/div[9]/div[2]/div[2]", // chart 2
		"//*[@id="pvExplorationHost"]/div/div/div/div[1]/div[2]/div[6]/div[2]/div" // slicer 1
		//...
	};

	foreach (var xpath in xpaths)
		wait.Until(ExpectedConditions.ElementIsVisible(By.XPath(xpath)));
}

Traté de hacer que el código anterior fuera más universal al encontrar elementos usando css (By.CssSelector). Con ese enfoque, puedo obtener todos los elementos necesarios, pero ElementoEsVisible y Visibilidad de todos los elementos ubicados por los métodos parecen comportarse de manera diferente en ese caso y el código nunca detiene la ejecución.

¿Cuál sería la forma correcta de verificar si la página de PowerBI se ha cargado?

Gracias,

taruntalreja08

Oye, ¿obtuviste la solución a tu problema? ¿Puedes proporcionarme el código de muestra? Quiero crear una herramienta para capturar el tiempo de carga de la página de un informe de Power BI. ¿Me pueden ayudar con el enfoque que debo seguir?

knyazs

En respuesta a taruntalreja08

Desafortunadamente, no puedo compartir el código con usted, pero puedo decirle cómo lo resolví: con Selenium logré que funcionara al «atrapar» la llamada «rueda giratoria» o el signo de «esperar» en la página después de hacer clic en la cortadora. Comenzaría a medir el tiempo desde el clic de la cortadora y luego esperaría unos segundos para ver si aparece y desaparece el signo de «esperar». Si no hay señal de espera después de unos segundos, tomaría el tiempo capturado inmediatamente después del clic de la cortadora; si apareciera «esperar», esperaría hasta que desaparezca y capturaría la marca de tiempo.

Espero que esto ayude.

wadezone

En respuesta a knyazs

Sé que no puede compartir su código, pero un ejemplo de su código con nombres ficticios sería bueno para comprender cómo pudo usar la rueda giratoria. ¿Obtuviste esto de otro ejemplo en la web?

Anónimo

En respuesta a knyazs

Oye,

Estoy haciendo algo similar en selenio con el informe PBI. ¿Puede compartir cómo obtuvo el símbolo o elemento de espera en el informe?

Gracias,

Kanika

ekeijl

La nueva API de JavaScript le permite escuchar el evento que indica que el informe terminó de cargarse:

https://github.com/Microsoft/PowerBI-JavaScript/wiki/Handling-Events

No estoy seguro de si podría usar esto directamente en su prueba. Un enfoque diferente podría ser escuchar el evento ‘cargado’ en el código de su aplicación y luego hacer algunos cambios en el DOM en su aplicación (algo que Selenium puede detectar) que marca el informe como ‘carga finalizada’.

Solo una idea, espero que esto ayude 🙂


@knyazs escribió:

¡Hola!

Estoy usando Selenium para automatizar las pruebas de carga y rendimiento de los informes de PowerBI y necesito una forma confiable de pausar la ejecución del código hasta que la página esté completamente cargada (todas las consultas ejecutadas y todas las segmentaciones y gráficos mostrados). Muchas páginas en Google

¿Cuál sería la forma correcta de verificar si la página de PowerBI se ha cargado?

Gracias,


@knyazs

No tengo mucha experiencia en javascript, por lo que no tengo idea de cómo capturar la carga de la página realizada en JS.

Sin embargo, según el conocimiento de mi trabajo anterior, para probar el rendimiento de carga de la página, una forma más precisa sería rastrear el tráfico de la red. Y según mi prueba, con respecto a un informe incrustado, el intervalo de carga se encuentra entre la primera solicitud de URL incrustada y la última solicitud de «datos de consulta». Vea la siguiente instantánea capturada en F12 en Firefox. Por lo tanto, puede considerar usar Wireshark o Fiddler.

Captura.PNG

knyazs

En respuesta a Eric_Zhang

Hola Eric,

Gracias por la rápida respuesta. Fiddler es una gran herramienta, pero no creo que pueda usarla en este caso.

Solo para ser absolutamente claro sobre este asunto, permítanme explicar lo que estoy haciendo: creé un proyecto C# que usa Selenium para simular los clics de los usuarios en las segmentaciones de informes de PowerBI. Después de hacer clic en la segmentación, la página comenzará a actualizarse, pero Selenium no puede detectar automáticamente cuándo finaliza la carga, ya que PowerBI (supongo) usa ajax/json/jquery. Si la página no está completamente cargada y el código continúa con la ejecución (siguiente clic en la segmentación), puede ocurrir un intento de hacer clic en un elemento no existente/no visible/en el que no se puede hacer clic/… y el código generará un error. Además, agregar un retraso después de hacer clic en la cortadora no es una opción, ya que estoy tratando de probar qué tan rápido es el informe.

Gracias,

ddevogel

En respuesta a knyazs

@knyazs ¿Podría ayudar el ImplicitWait incorporado de Selenium a resolver su problema?

http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp

http://stackoverflow.com/questions/11001030/how-i-can-check-si-una-pagina-esta-cargada-completamente-o-n…

knyazs

En respuesta a ddevogel

@ddevogel Sí, actualmente estoy usando ese mecanismo (consulte el ejemplo de código en mi primera publicación) y funciona bien. El problema es que se deben tomar XPaths para cada elemento de cada informe y, si el informe cambia, también se debe cambiar el código.

Me preguntaba si hay algo «universal» para las páginas de PowerBI, como alguna marca o etiqueta en la página que pueda reutilizar en varios informes.

@ekeijl Suena prometedor. Como solo conozco los conceptos básicos de JavaScript / Web Dev, la muestra de código de este enfoque significaría mucho 🙂

ekeijl

En respuesta a knyazs

Hay bastantes ejemplos de código en la wiki de Github, te sugiero que los revises.

Se vería algo como esto (combinando esto y esto😞

// HTML
<div
    powerbi-type="report"
    powerbi-report-id="5dac7a4a-4452-46b3-99f6-a25915e0fe55"
    powerbi-embed-url="https://app.powerbi.com/reportEmbed"
></div>

// JS
var embedConfiguration = {
    type: 'report',
    id: '5dac7a4a-4452-46b3-99f6-a25915e0fe55',
    embedUrl: 'https://app.powerbi.com/reportEmbed'
};
var $reportContainer = $('#reportContainer');
var report = powerbi.embed($reportContainer.get(0), embedConfiguration);

// Here we listen for the loaded event
report.on('loaded', event => {
    // Here the reports are loaded, do something that can be detected by Selenium.
    $('#reportContainer').addClass('done-loading');
});

knyazs

En respuesta a ekeijl

@ekeijl powerbi-type, powerbi-report-id y powerbi-embed-url son propiedades que no existen en el informe hasta que incrusta el informe en otro lugar; es entonces cuando el informe también obtiene la identificación.

No me gustaría incrustar el informe de PowerBI, solo necesito encontrar algún elemento existente (documento, ventana o algo tercero) para adjuntar e inyectar o ejecutar JS para verificar si la página está cargada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *