Actualmente estoy tratando de capturar una captura de pantalla usando Selenium WebDriver. Pero solo puedo obtener la captura de pantalla de la página completa. Sin embargo, lo que quería es capturar solo una parte de la página o quizás solo un elemento específico basado en la identificación o cualquier localizador de elemento específico. (Por ejemplo, deseo capturar la imagen con id de imagen = "Mariposa")
¿Hay alguna forma de capturar una captura de pantalla por elemento o elemento seleccionado?
Respuestas:
Podemos obtener la captura de pantalla del elemento recortando la captura de pantalla completa de la página como se muestra a continuación:
driver.get("http://www.google.com"); WebElement ele = driver.findElement(By.id("hplogo")); // Get entire page screenshot File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); BufferedImage fullImg = ImageIO.read(screenshot); // Get the location of element on the page Point point = ele.getLocation(); // Get width and height of the element int eleWidth = ele.getSize().getWidth(); int eleHeight = ele.getSize().getHeight(); // Crop the entire page screenshot to get only element screenshot BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(), eleWidth, eleHeight); ImageIO.write(eleScreenshot, "png", screenshot); // Copy the element screenshot to disk File screenshotLocation = new File("C:\\images\\GoogleLogo_screenshot.png"); FileUtils.copyFile(screenshot, screenshotLocation);
fuente
Aquí hay una versión de Python 3 que usa Selenium webdriver y Pillow. Este programa captura la captura de pantalla de toda la página y recorta el elemento según su ubicación. La imagen del elemento estará disponible como image.png. Firefox admite guardar la imagen del elemento directamente usando element.screenshot_as_png ('image_name').
Actualizar
Ahora Chrome también admite capturas de pantalla de elementos individuales. Por lo tanto, puede capturar directamente la captura de pantalla del elemento web como se indica a continuación.
fuente
element.size
se da en puntos, mientras que la captura de pantalla producida pordriver.save_screenshot
tiene dimensiones de píxeles. Si su pantalla tiene una proporción de píxel a punto distinta de 1 (por ejemplo, los MacBooks con retina tienen dos píxeles por punto, una proporción de 2), entonces debe multiplicarw
yh
por esa proporción.from StringIO import StringIO; from PIL import Image; img = Image.open(StringIO(image))
import io; from PIL import Image; img = Image.open(io.BytesIO(image)); img.save("image.png")
En
Node.js
, escribí el siguiente código que funciona pero no se basa en el WebDriverJS oficial de selenium, sino enSauceLabs's WebDriver
: WD.js y una biblioteca de imágenes muy compacta llamada EasyImage .Solo quiero enfatizar que realmente no puede tomar la captura de pantalla de un elemento, pero lo que debe hacer es primero, tomar la captura de pantalla de toda la página, luego seleccionar la parte de la página que le gusta y recortar esa parte específica:
Y la función cropInFileFunction, es así:
fuente
El marco ASHOT de Yandex se puede utilizar para tomar capturas de pantalla en los scripts de Selenium WebDriver para
Este marco se puede encontrar en https://github.com/yandex-qatools/ashot .
El código para tomar las capturas de pantalla es muy sencillo:
PÁGINA COMPLETA
ELEMENTO WEB ESPECÍFICO
Vea más detalles y más ejemplos de código en este artículo .
fuente
.shootingStrategy(ShootingStrategies.viewportPasting(100))
con elSPECIFIC WEB ELEMENT
modo, o puede que no capture todos los elementos.Para todos los que soliciten código en C #, a continuación se muestra una versión simplificada de mi implementación.
fuente
Perdí mucho tiempo tomando capturas de pantalla y quiero guardar la tuya. He usado chrome + selenium + c # el resultado fue totalmente horrible. Finalmente escribí una función:
fuente
La respuesta de Surya funciona muy bien si no le importa involucrar el disco IO. Si prefiere no hacerlo, este método puede ser mejor para usted.
Si lo prefiere, puede omitir declarar
screengrab
y en su lugar hacerque es más limpio, pero lo dejé para mayor claridad. Luego puede guardarlo como un archivo o ponerlo en un JPanel al contenido de su corazón.
fuente
Python 3
Probado con Selenium 3.141.0 y chromedriver 73.0.3683.68, esto funciona,
No es necesario obtener una imagen completa y obtener una sección de una imagen a pantalla completa.
Es posible que esto no estuviera disponible cuando se creó la respuesta de Rohit .
fuente
fuente
Si está buscando una solución de JavaScript, aquí está mi esencia:
https://gist.github.com/sillicon/4abcd9079a7d29cbb53ebee547b55fba
La idea básica es la misma, primero tome la captura de pantalla y luego recórtela. Sin embargo, mi solución no requerirá otras bibliotecas, solo código API de WebDriver puro. Sin embargo, el efecto secundario es que puede aumentar la carga de su navegador de prueba.
fuente
Aquí hay una función de extensión para C #:
Ahora puedes usarlo para tomar la imagen de cualquier elemento como este:
fuente
Considere el uso de aguja: herramienta para comparación visual automatizada https://github.com/bfirsh/needle , que tiene una funcionalidad incorporada que permite tomar capturas de pantalla de elementos específicos (seleccionados por el selector de CSS). La herramienta funciona en WebDriver de Selenium y está escrita en Python.
fuente
Debajo de la función para tomar una instantánea de un elemento específico en Selenium. Aquí el controlador es un tipo de WebDriver.
fuente
código c #:
fuente
fuente
Si obtiene una excepción java.awt.image.RasterFormatException en Chrome, o si desea desplazar un elemento a la vista, haga una captura de pantalla.
Aquí hay una solución de la respuesta de @Surya.
fuente
Esta es mi versión, en C #, básicamente obtuve la mayor parte de la respuesta de Brook y la modifiqué para que se ajustara a mi propósito
fuente
Creo que esto no funcionará para usted ya que usa C # y mi solución incluye una biblioteca Java, sin embargo, tal vez otros lo encuentren útil.
Para realizar capturas de pantalla personalizadas, puede utilizar la biblioteca Shutterbug. La convocatoria específica para este fin sería:
fuente
Seguí el código de muestra de @codeslord, pero por alguna razón tuve que acceder a mis datos de captura de pantalla de manera diferente:
# Open the Firefox webdriver driver = webdriver.Firefox() # Find the element that you're interested in imagepanel = driver.find_element_by_class_name("panel-height-helper") # Access the data bytes for the web element datatowrite = imagepanel.screenshot_as_png # Write the byte data to a file outfile = open("imagepanel.png", "wb") outfile.write(datatowrite) outfile.close()
(usando Python 3.7, Selenium 3.141.0 y Mozilla Geckodriver 71.0.0.7222)
fuente
Estoy usando una versión modificada de la respuesta de @ Brook y funciona bien incluso para elementos que necesitan que la página se desplace.
Los dos
if
eran necesarios (al menos para el controlador de Chrome) porque el tamaño del recorte excedía en 1 píxel el tamaño de la captura de pantalla, cuando era necesario desplazarse.fuente