¿Cómo comparar 2 iframes y obtener una diferencia visual?

21

Caso:

Tengo 2 iframes y ambos tienen muchos divs y otros controles, por lo que ambos son como el tamaño medio de los sitios web HTML. Quiero comparar ambos y descubrir diferencias.

Pensé diferentes opciones aquí:

Solución 1: tome una captura de pantalla completa de 2 iframes y compare ambas capturas de pantalla utilizando la biblioteca de almohadas de Python que dibuja la cuadrícula en el área de discrepancia en una captura de pantalla. Pero aquí el problema es que no encontré ningún código en Internet que pueda tomar capturas de pantalla completas del iframe ( tengo un iframe largo con una barra de desplazamiento ). Intenté casi todas las respuestas en SO, pero todas funcionan para una página normal, pero no para el iframe.

Referencia : https://blog.rinatussenov.com/automating-manual-visual-regression-tests-with-python-and-selenium-be66be950196

Solución 2: Obtenga de alguna manera todo el código HTML de ambos iframe y compárelo, pero no será fácil analizar el resultado porque encontrará algún código HTML diferente o que no coincida en 2 iframes. Esto será más como comparar texto y no es una buena solución, creo.

Así que estoy buscando un código que pueda tomar una captura de pantalla completa del iframe usando Python o Javascript O alguna opción mejor que me permita comparar 2 iframes y descubrir diferencias.

Intenté casi todas las respuestas que google encuentra nuestras según a continuación:

ingrese la descripción de la imagen aquí

Aquí se muestra un Iframe de muestra donde todo el html está dentro del iframe: https://grapesjs.com/demo.html , si algún código puede tomar una captura de pantalla completa de este iframe, entonces será fácil de comparar para mí.

Manos amigas
fuente
Todos los iframes debajo son páginas html normales. ¿Desea ver específicamente cómo son los iframes?
Matt Ellen
Sí, todos están en la página html. Mi objetivo es asegurarme de que ambos iframe tengan el mismo aspecto en términos visuales.
Manos amigas
Entonces, ¿sería aceptable abrir las páginas que muestran los iframes como páginas de nivel superior y capturarlas?
Matt Ellen
Creo que sí, pero cómo es posible porque todos los códigos de captura de pantalla que probé son capaces de tomar una captura de pantalla completa de cualquier página, pero cuando se trata de iframe, toma una captura de pantalla de solo una parte que es visible sin desplazamiento.
Manos amigas
Tiene las URL de iframe, por lo que puede abrirlas como páginas de nivel superior.
Matt Ellen

Respuestas:

8

Como descubrimos en nuestro chat , los iframes en discusión se generan en JavaScript y no se cargan desde una URL.

Esto presenta una dificultad para automatizar la captura de pantalla del iframe, sin embargo, es posible un proceso manual:

En Firefox, haga clic derecho en el iframe y seleccione "Este marco" en el menú emergente, luego seleccione "Guardar marco como ...".

imagen de menús

Una vez que se guarda el marco, será necesario manipular parte del CSS descargado para que las URL de fondo apunten al lugar correcto. Una vez hecho esto, abra el archivo html localmente y podrá tomar una captura de pantalla utilizando el método que usa actualmente para una página web normal.

Matt Ellen
fuente
6

Agarrando parte de la pantalla

Puede tomarlo de forma manual o automática. Si no hay muchos iframes para comparar, entonces hacerlo manualmente es una opción, simplemente haga una captura de pantalla que contenga el contenido y recorte la imagen si es necesario. La dificultad de este enfoque es que debe ser muy muy preciso al recortar.

También puede hacerlo automáticamente, por ejemplo, cargar la parte del DOM en un lienzo y hacer una foto del mismo, como aquí: Usar HTML5 / Canvas / JavaScript para tomar capturas de pantalla en el navegador

Además, puede modificar temporalmente su contenido para asegurarse de que toda la página es lo que le interesa y luego hacer una captura de pantalla, como se describe aquí: https://www.cnet.com/how-to/how-to-take- a-screenshot-of-a-whole-web-page-in-chrome /

Comparando dos imágenes

Puede comparar dos imágenes girando todos sus píxeles y comparándolos.

Algoritmo para comparar dos imágenes.

Mostrando los resultados

Su programa debe tomar dos imágenes como entrada y crear una nueva imagen de tamaño similar a la salida. Sugeriría que la imagen de destino debería mostrar los píxeles de una de las imágenes para comparar y dibujar una línea roja en el borde de cada diferencia. Para este propósito, deberá dividir una región de diferencias en rectángulos. De esta manera, podría ver dónde están las diferencias y cuál es el contenido que es diferente.

Lajos Arpad
fuente
Gracias por su respuesta. ¿Hay alguna posibilidad de que pueda usar Html2Canvas con python porque necesito algo en python o javascript que pueda tomar una captura de pantalla completa de iframe?
Helping Hands
@HelpingHands HTML2Canvas es una herramienta Javascript, por lo que puede usarla a través de Javascript (ver: html2canvas.hertzen.com ). Al buscar usos de HTML2Canvas en Python, he encontrado un proxy de Python. No lo intenté, pero espero que ayude. Aquí está: github.com/brcontainer/html2canvas-python-proxy
Lajos Arpad
2

Puede usar la almohada en combinación con pyautogui, mayby ​​pyautogui solo.

Algunos pseudocódigo:

Mientras la barra de desplazamiento no toque la parte inferior: - tome una captura de pantalla - guarde el nombre de la captura de pantalla en la lista - desplácese hacia abajo, continúe este ciclo

Realice el bucle anterior nuevamente para el segundo iframe

compare todas las capturas de pantalla de las dos listas de capturas de pantalla que ha generado.

Bueno, así es como lo haría. Sin embargo, probablemente haya mejores maneras.

PythonAmateur742
fuente
La cosa es que solo tengo un iframe, pero es largo verticalmente y ninguna herramienta puede tomar su captura de pantalla completa.
Manos amigas
No necesitas una captura de pantalla larga. Varias capturas de pantalla también serán excelentes. Siempre que se desplace la misma cantidad hacia abajo. Básicamente, dejas que tu iframe se enfoque. Luego presiona la flecha hacia abajo 5 (o lo que sea que necesite) veces y tome una captura de pantalla. No importa si tienes un poco de contenido doble en tus capturas de pantalla. Usted hace lo mismo para el otro iframe.
PythonAmateur742
1

Use html2canvas para tomar una captura de pantalla

html2canvas(document.getElementById("img_dots")).then(
  function (canvas2) {
    var img_data2 = canvas2.toDataURL('image/png');
    var im_data2 = img_data2.replace('data:image/png;base64,', '');
    $.ajax({
      type: "POST",
      url: "send_image_to_backend",
      data: {
        "base64data": im_data2,
        // "filename": filename.split(".")[0]
        "filename": new_filename + ".png"
      }, success: function () {
         //send second image and compare
      }
    });
  }
);

Esto le permitirá enviar imágenes al back-end.

Use este hilo para ajustar html2canvas para obtener la imagen completa

Una vez que tenga ambas imágenes, puede usar openCV para encontrar la diferencia entre 2 imágenes, puede consultar esto: https://www.pyimagesearch.com/2017/06/19/image-difference-with-opencv-and-python/

Aqua 4
fuente
1

Tengo 2 iframes y ambos tienen muchos divs y otros controles, por lo que ambos son como el tamaño medio de los sitios web HTML. Quiero comparar ambos y descubrir diferencias.

¿Qué quieres comparar? Reglas CSS / diferencias de propiedades? ¿Datos / diferencias de texto? O renderizado visual?


Comparar renderizado visual

Puede extraer la URL del iframe y cargar la página con Selenium para tomar una captura de pantalla (ver ejemplo) . También tienes la extensión de Firefox Selenium IDE .

A-312
fuente
Gracias por su respuesta. En realidad mi iframe no tiene url o src. Y tomar captura de pantalla solo toma ver captura de pantalla del puerto, pero necesito una captura de pantalla completa del iframe.
Manos amigas