tutorial chrome selenium webdriver

chrome - selenium webdriver python



¿Cómo tomar una captura de pantalla parcial(marco) con Selenium WebDriver? (5)

Ruby solution

Preparar

Instalar xvfb

apt-get install xvfb -y

Instalar un navegador sin cabeza y una gema de manipulación de imágenes

gem install chunky_png gem install headless gem install selenium-webdriver

Instalar el controlador Chrome

wget http://chromedriver.googlecode.com/files/chromedriver_linux64_<latest>.zip apt-get install unzip unzip chromedriver_linux64_<latest>.zip cp chromedriver /usr/local/bin

Más información se puede encontrar aquí

Código

#!/usr/bin/env ruby require "headless" require "selenium-webdriver" require ''chunky_png'' headless = Headless.new headless.start site = "?_some_site_?" driver = Selenium::WebDriver.for :chrome driver.navigate.to site sleep 1 driver.save_screenshot(''screenshot.png'') el= driver.find_element(:xpath, ''?_some_xpath_?'') image = ChunkyPNG::Image.from_file(''screenshot.png'') image.crop!(el.location.x + 1, el.location.y + 1, el.size.width, el.size.height) image.save(''croped.png'') driver.quit headless.destroy

¿Es posible tomar una captura de pantalla con WebDriver de solo un marco (no la ventana completa) dentro de un conjunto de marcos?

Alternativamente, ¿es posible definir las coordenadas de una ventana para la captura de pantalla o recortar la imagen después?


Esto debería funcionar:

import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.Point; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; public class Shooter{ private WebDriver driver; public void shootWebElement(WebElement element) throws IOException { File screen = ((TakesScreenshot) this.driver).getScreenshotAs(OutputType.FILE); Point p = element.getLocation(); int width = element.getSize().getWidth(); int height = element.getSize().getHeight(); BufferedImage img = ImageIO.read(screen); BufferedImage dest = img.getSubimage(p.getX(), p.getY(), width, height); ImageIO.write(dest, "png", screen); File f = new File("S://ome//where//over//the//rainbow"); FileUtils.copyFile(screen, f); } }


Simplemente publicando una solución basada en C # al tomar una captura de pantalla de un elemento Html específico en selenio:

Primero debemos tomar la captura de pantalla de toda la página web utilizando el método GetScreenShot del controlador web de selenio, como se muestra a continuación.

Screenshot screenshot = ((ITakesScreenshot)this.driver).GetScreenshot(); screenshot.SaveAsFile(filename, System.Drawing.Imaging.ImageFormat.Jpeg);

A continuación, cree un rectángulo a partir de la ubicación, la altura y el ancho del elemento html especificado. (Esto debe obtenerse utilizando el método FindElement() de selenio proporcionando nombre de identificación o clase).

Image img = Bitmap.FromFile(uniqueName); Rectangle rect = new Rectangle(); if (element != null) { // Get the Width and Height of the WebElement using int width = element.Size.Width; int height = element.Size.Height; // Get the Location of WebElement in a Point. // This will provide X & Y co-ordinates of the WebElement Point p = element.Location; // Create a rectangle using Width, Height and element location rect = new Rectangle(p.X, p.Y, width, height); }

Al usar esto vamos a recortar la captura de pantalla de la siguiente manera y el resultado será el elemento web específico de la captura de pantalla.

Bitmap bmpImage = new Bitmap(img); var cropedImag = bmpImage.Clone(rect, bmpImage.PixelFormat);

Código completo como método a continuación:

/// <summary> /// Captures the element screen shot. /// </summary> /// <param name="element">The element.</param> /// <param name="uniqueName">Name of the unique.</param> /// <returns>returns the screenshot image </returns> public Image CaptureElementScreenShot(HTMLElement element, string uniqueName) { Screenshot screenshot = ((ITakesScreenshot)this.driver).GetScreenshot(); screenshot.SaveAsFile(filename, System.Drawing.Imaging.ImageFormat.Jpeg); Image img = Bitmap.FromFile(uniqueName); Rectangle rect = new Rectangle(); if (element != null) { // Get the Width and Height of the WebElement using int width = element.Size.Width; int height = element.Size.Height; // Get the Location of WebElement in a Point. // This will provide X & Y co-ordinates of the WebElement Point p = element.Location; // Create a rectangle using Width, Height and element location rect = new Rectangle(p.X, p.Y, width, height); } // croping the image based on rect. Bitmap bmpImage = new Bitmap(img); var cropedImag = bmpImage.Clone(rect, bmpImage.PixelFormat); return cropedImag; }


Solución Scala:

import javax.imageio.ImageIO import java.awt.image.BufferedImage // phone is a case class with witdth and height Int fields def producer { [..] processScreenshot(driver.getScreenshotAs(OutputType.FILE), ph) } def processScreenshot(file: File, phone: Phone) = { val img: BufferedImage = ImageIO.read(file) val w = math.min(img.getWidth, phone.width) val h = math.min(img.getHeight, phone.height) val dest = img.getSubimage(0, 0, w, h) ImageIO.write(dest, "png", new File(s"/tmp/${un}_${phone.file}.png")) }


Solución de Python (dependencia: PIL o Pillow):

from PIL import Image from selenium import webdriver def element_screenshot(driver, element, filename): bounding_box = ( element.location[''x''], # left element.location[''y''], # upper (element.location[''x''] + element.size[''width'']), # right (element.location[''y''] + element.size[''height'']) # bottom ) return bounding_box_screenshot(driver, bounding_box, filename) def bounding_box_screenshot(driver, bounding_box, filename): driver.save_screenshot(filename) base_image = Image.open(filename) cropped_image = base_image.crop(bounding_box) base_image = base_image.resize(cropped_image.size) base_image.paste(cropped_image, (0, 0)) base_image.save(filename) return base_image if __name__ == ''__main__'': driver = webdriver.Firefox() driver.get(''https://www.google.com/?gws_rd=ssl'') element = driver.find_element_by_id(''body'') screenshot = element_screenshot(driver, element, ''element.png'') # Screenshot the ''#body'' element bounding_box = (100, 100, 600, 600) screenshot = bounding_box_screenshot(driver, bounding_box, ''box.png'') # Screenshot the bounding box (100, 100, 600, 600)