Cómo tomar una captura de pantalla con Selenium WebDriver

498

¿Alguien sabe si es posible tomar una captura de pantalla con Selenium WebDriver? (Nota: No Selenium RC)

James Hollingworth
fuente
Probablemente solo haya una forma de hacerlo con el protocolo WebDriver Wire, pero nadie usa este protocolo directamente. En cambio, las personas usan diferentes enlaces / bibliotecas de idiomas que envuelven el protocolo de bajo nivel. Hay un montón de enlaces de idiomas, por lo que debe decir cuál desea usar. De lo contrario, hay demasiadas respuestas.
Oberlies
¿Qué lenguaje de programación estás usando?
Ripon Al Wasim
¿Quieres tomar una captura de pantalla de toda la página o un elemento específico?
Ripon Al Wasim
Sí, es posible tomar capturas de pantalla de la página completa o de un elemento específico con Selenium WebDriver
Ripon Al Wasim

Respuestas:

506

Java

Sí, es posible. El siguiente ejemplo está en Java:

WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy somewhere
FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));
Sergii Pozharov
fuente
30
Copiar el archivo, en lugar de renombrarlo, es una buena idea si existe la posibilidad de que el origen y el destino no estén en el mismo sistema de archivos. No puede cambiar el nombre a través de los límites del sistema de archivos (en Unix, al menos). Tenga en cuenta que es común /tmpestar en su propio sistema de archivos, y FirefoxDriver escribe capturas de pantalla en /tmp.
Tom Anderson
99
¿Hay alguna manera de hacerlo solo en casos fallidos?
some_other_guy
66
Vale la pena señalar que HtmlUnitDriverno se implementa TakesScreenshot(consulte selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… para obtener una lista de los controladores compatibles). Pero puedes guardar como HTML.
Wernight
77
¿Qué paquete se requiere para importar para usar la clase FileUtils?
Ripon Al Wasim
77
@RiponAlWasim probablementeorg.apache.commons.io.FileUtils
Ben
270

Pitón

Cada WebDriver tiene un .save_screenshot(filename)método. Entonces, para Firefox, se puede usar así:

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('http://www.google.com/')
browser.save_screenshot('screenie.png')

Confusamente, .get_screenshot_as_file(filename)también existe un método que hace lo mismo.

También hay métodos para: .get_screenshot_as_base64()(para incrustar en html) y .get_screenshot_as_png()(para recuperar datos binarios).

y Tenga en cuenta que WebElements tiene un .screenshot()método que funciona de manera similar, pero solo captura el elemento seleccionado.

Corey Goldberg
fuente
Para otros navegadores, intercambie la instancia del controlador web. Si solo desea capturas de pantalla de su sitio web, incluido el estado, eche un vistazo a Usersnap .
Gregor
@ DavidRöthlisberger eso es genial, pero tu comentario no tiene nada que ver con mi respuesta
Corey Goldberg
Para hacer una captura de pantalla de una página completa, no solo el área visible, use mi código de Python de mi respuesta aquí para stich: stackoverflow.com/questions/37906704/…
Fabian Thommen
1
@CoreyGoldberg Cierto, nada que ver con tu respuesta. Pero mi antiguo script usaba un FF anterior y ocupaba toda la página, no solo la ventana gráfica. Después de que lo cambiaron a estándar ahora solo viewport. Entonces quería ayudar a alguien que tenía el mismo problema. Y sí, ¡el elemento fijo es un verdadero dolor en scroll / stich!
Fabian Thommen
1
Una cosa más que me ayudó inmensamente, si necesita cambiar la dimensión de la imagen, simplemente configure el tamaño de la ventana antes de tomar la instantánea driver.set_window_size(1366, 728).
SpoiledBrat
110

C#

public void TakeScreenshot()
{
    try
    {            
        Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
        ss.SaveAsFile(@"D:\Screenshots\SeleniumTestingScreenshot.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        throw;
    }
}
jessica
fuente
99
Funciona perfectamente. Advertencia: toma una captura de pantalla, no una captura de página.
ljgww
¿Quieres decir que tiene escritorio y todo? ¿O quieres decir que solo obtiene la ventana gráfica?
vtortola
Solo obtendrá lo que está dentro del alcance del controlador, esto es para permitir que se realicen múltiples pruebas paralelas. Tenga en cuenta que no se alejará si el foco de la ventana principal de su controlador tiene una barra de desplazamiento o si excede una sola página.
Ben
3
actualizar a SaveAsFile (ruta de cadena, formato ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran
1
¡Esto funcionó para mí! Estaba usando CopyFromScreen desde el espacio de nombres de gráficos. La ventaja de la solución anterior es que funciona cuando el código se llama sin cabeza desde TFS. Mi antiguo método CopyFromScreen solo funcionaba cuando ejecutaba pruebas de selenio desde Visual Studio, pero nunca funcionaba para mis pruebas de ejecución TFS.
Ewan
74

JavaScript (Selenium-Webdriver)

driver.takeScreenshot().then(function(data){
   var base64Data = data.replace(/^data:image\/png;base64,/,"")
   fs.writeFile("out.png", base64Data, 'base64', function(err) {
        if(err) console.log(err);
   });
});
Moiz Raja
fuente
3
Similar a cómo lo describe Browserstack: browserstack.com/automate/node#enhancements-screenshots
Mike Causer
en data.replace ¿qué estás haciendo exactamente entre paréntesis?
John Demetriou
@JohnDemetriou, datos es el nombre del objeto o variable que se creará cuando lo llame. Puedes llamarlo var1si lo deseas. Debes mirar la takeScreenshot()función para saber qué es exactamente. Tal vez una imagen binaria renderizada desde javascript usando canvas. Puede ser el dom, antes de que se procese. Examinar.
m3nda
66

Rubí

require 'rubygems'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :ie 
driver.get "https://www.google.com"   
driver.save_screenshot("./screen.png")

hay más tipos de archivos y opciones disponibles y puede verlos en takes_screenshot.rb

sirclesam
fuente
Funcionó bien para mí usando Selenium Grid 2. Script y hub que se ejecuta en OS X Snow Leopard; nodo que se ejecuta en RedHat EL 4 con Firefox 3.6.18 en Xvfb.
MarkD
1
¿Hay alguna forma de tomar la captura de pantalla de la página completa, no solo el área visible?
Arihant Godha
2
La página completa se toma por defecto. Al menos usando headlessyFirefox
Ashley
35

Java

Tengo este problema resuelto. Puede aumentar el RemoteWebDriverpara darle todas las interfaces que implementa su controlador proxy:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
usuario708910
fuente
Si hace eso, ¿no necesita copiar capturas de pantalla a un nombre de archivo con threadId para que pueda saber qué hilos / instancias de su controlador arrojaron la captura de pantalla? De lo contrario, ¿varias instancias de un navegador en un nodo de cuadrícula sobrescribirían las capturas de pantalla de los demás?
djangofan
1
Me gustaría señalar que solo esta solución funcionó para mí usando ChromeDriver sin cabeza
GabrielRado
34

PHP (PHPUnit)

Utiliza la extensión PHPUnit_Selenium versión 1.2.7:

class MyTestClass extends PHPUnit_Extensions_Selenium2TestCase {
    ...
    public function screenshot($filepath) {
        $filedata = $this->currentScreenshot();
        file_put_contents($filepath, $filedata);
    }

    public function testSomething() {          
        $this->screenshot('/path/to/screenshot.png');
    }
    ...
}
Ryan Mitchell
fuente
daaaamn! Quiero saber más sobre esto, Selenium es nuevo para mí y estoy buscando una solución cli para crear capturas de pantalla en varios navegadores y sistemas operativos para hacer pruebas visuales
pythonian29033
25

C#

public Bitmap TakeScreenshot(By by) {
    // 1. Make screenshot of all screen
    var screenshotDriver = _selenium as ITakesScreenshot;
    Screenshot screenshot = screenshotDriver.GetScreenshot();
    var bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray));

    // 2. Get screenshot of specific element
    IWebElement element = FindElement(by);
    var cropArea = new Rectangle(element.Location, element.Size);
    return bmpScreen.Clone(cropArea, bmpScreen.PixelFormat);
}
wsbaser
fuente
18

Java

public String captureScreen() {
    String path;
    try {
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File source = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE);
        path = "./target/screenshots/" + source.getName();
        FileUtils.copyFile(source, new File(path)); 
    }
    catch(IOException e) {
        path = "Failed to capture screenshot: " + e.getMessage();
    }
    return path;
}
SilverColt
fuente
¿Qué controlador usaste? nuevo Augmenter (). augment (driver);
kozla13
12

Jython

import org.openqa.selenium.OutputType as OutputType
import org.apache.commons.io.FileUtils as FileUtils
import java.io.File as File
import org.openqa.selenium.firefox.FirefoxDriver as FirefoxDriver

self.driver = FirefoxDriver()
tempfile = self.driver.getScreenshotAs(OutputType.FILE)
FileUtils.copyFile(tempfile, File("C:\\screenshot.png"))
Mente fresca
fuente
9

Java (Robot Framework)

Usé este método para tomar capturas de pantalla.

void takeScreenShotMethod(){
    try{
        Thread.sleep(10000)
        BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
        ImageIO.write(image, "jpg", new File("./target/surefire-reports/screenshot.jpg"));
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

Puede usar este método cuando sea necesario.

ank
fuente
Su enfoque debe permanecer en el navegador todo el tiempo, de lo contrario, se toma una instantánea de lo que está enfocado actualmente.
kushal.8
8

Java

Parece que falta aquí: tomar una captura de pantalla de un elemento específico en Java:

public void takeScreenshotElement(WebElement element) throws IOException {
    WrapsDriver wrapsDriver = (WrapsDriver) element;
    File screenshot = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);
    Rectangle rectangle = new Rectangle(element.getSize().width, element.getSize().height);
    Point location = element.getLocation();
    BufferedImage bufferedImage = ImageIO.read(screenshot);
    BufferedImage destImage = bufferedImage.getSubimage(location.x, location.y, rectangle.width, rectangle.height);
    ImageIO.write(destImage, "png", screenshot);
    File file = new File("//path//to");
    FileUtils.copyFile(screenshot, file);
}
Erki M.
fuente
No creo que este enfoque real pueda funcionar, ya que la captura de pantalla y el navegador real tienen resoluciones diferentes. Entonces, cuando use la ubicación de coordenadas obtenida por el selenio en su imagen, seguramente se encontrará con una java.awt.image.RasterFormatException: (y + height) está fuera de Raster
Ichwardort el
¿Probaste el código? Funcionó la última vez que lo intenté.
Erki M.
1
Funciona perfectamente bien siempre que intentes capturar un elemento que sea visible sin desplazarse. Cuando necesita desplazarse a un elemento para capturarlo, el desplazamiento y se calcula desde la parte superior de la página, que luego excede los límites de la imagen de pantalla completa. Entonces, la solución más fácil es aumentar el tamaño de la pantalla codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); o para eliminar cualquier elemento no requerido a través de css. La solución adecuada sería calcular el desplazamiento y del desplazamiento.
Ichwardort
1
En Firefoxfunciona bien, ya que recorta la pantalla del elemento de la imagen completa basada en dimensiones. En Chromesi el elemento está disponible en parte con vista a cabo el desplazamiento de la porción de esa imagen vista desde que capta elemento fina. Si queremos tomar una captura de pantalla después de desplazar document.documentElement.clientHeightdos veces la Altura del cliente, use (location.y)-2*clientHeightpara obtener una captura de pantalla exacta del elemento. Gracias por esta publicación, ya que me ayuda ...
Yash
6

C#

using System;
using OpenQA.Selenium.PhantomJS;
using System.Drawing.Imaging;

namespace example.com
{
    class Program
    {
        public static PhantomJSDriver driver;

        public static void Main(string[] args)
        {
            driver = new PhantomJSDriver();
            driver.Manage().Window.Size = new System.Drawing.Size(1280, 1024);
            driver.Navigate().GoToUrl("http://www.example.com/");
            driver.GetScreenshot().SaveAsFile("screenshot.png", ImageFormat.Png);
            driver.Quit();
        }
    }
}

Requiere NuGetPackages:

  1. PhantomJS 2.0.0
  2. Selenio. Soporte 2.48.2
  3. Selenium.WebDriver 2.48.2

Probado con .NETFramework v4.5.2

userlond
fuente
5

Java

No pude obtener la respuesta aceptada para trabajar, pero según la documentación actual de WebDriver , lo siguiente funcionó bien para mí con Java 7 en OS X 10.9:

import java.io.File;
import java.net.URL;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Testing {

   public void myTest() throws Exception {
       WebDriver driver = new RemoteWebDriver(
               new URL("http://localhost:4444/wd/hub"),
               DesiredCapabilities.firefox());

       driver.get("http://www.google.com");

       // RemoteWebDriver does not implement the TakesScreenshot class
       // if the driver does have the Capabilities to take a screenshot
       // then Augmenter will add the TakesScreenshot methods to the instance
       WebDriver augmentedDriver = new Augmenter().augment(driver);
       File screenshot = ((TakesScreenshot)augmentedDriver).
               getScreenshotAs(OutputType.FILE);
   }
}
Steve HHH
fuente
4

Rubí (pepino)

After do |scenario| 
    if(scenario.failed?)
        puts "after step is executed"
    end
    time = Time.now.strftime('%a_%e_%Y_%l_%m_%p_%M')

    file_path = File.expand_path(File.dirname(__FILE__) + '/../../../../../mlife_screens_shot')+'/'+time +'.png'

    page.driver.browser.save_screenshot file_path
end

Given /^snapshot$/ do
    time = Time.now.strftime('%a_%e_%Y_%l_%m_%p_%M')

    file_path = File.expand_path(File.dirname(__FILE__) + '/../../../../../mlife_screens_shot')+'/'+time +'.png'
    page.driver.browser.save_screenshot file_path
end
vijay chouhan
fuente
¿Qué lenguaje es este?
codygman
Parece que está en rubí, no utiliza ningún controlador web específico
James,
4

Rubí

time = Time.now.strftime('%a_%e_%Y_%l_%m_%p_%M_%S')
file_path = File.expand_path(File.dirname(__FILE__) + 'screens_shot')+'/'+time +'.png'
#driver.save_screenshot(file_path)
page.driver.browser.save_screenshot file_path
vijay chouhan
fuente
4

PHP

public function takescreenshot($event)
  {
    $errorFolder = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . "ErrorScreenshot";

    if(!file_exists($errorFolder)){
      mkdir($errorFolder);
    }

    if (4 === $event->getResult()) {
      $driver = $this->getSession()->getDriver();
      $screenshot = $driver->getWebDriverSession()->screenshot();
      file_put_contents($errorFolder . DIRECTORY_SEPARATOR . 'Error_' .  time() . '.png', base64_decode($screenshot));
    }
  }
Arpan Buch
fuente
en la versión actual de facebook / webdriver, el método es takeScreenshot () y no es necesario base64_encode () la salida antes de guardar el archivo.
billrichards
1
¿Podría agregar código a su ejemplo que muestre cómo llamar a esta takescreenshotfunción? Específicamente, ¿de dónde $eventviene la variable? Soy un novato completo de Selenium, ¡por lo que una respuesta a esta pregunta que no asume conocimiento previo de Selenium sería muy apreciada!
Kenny83
4

Potencia Shell

Set-Location PATH:\to\selenium

Add-Type -Path "Selenium.WebDriverBackedSelenium.dll"
Add-Type -Path "ThoughtWorks.Selenium.Core.dll"
Add-Type -Path "WebDriver.dll"
Add-Type -Path "WebDriver.Support.dll"

$driver = New-Object OpenQA.Selenium.PhantomJS.PhantomJSDriver

$driver.Navigate().GoToUrl("https://www.google.co.uk/")

# Take a screenshot and save it to filename
$filename = Join-Path (Get-Location).Path "01_GoogleLandingPage.png"
$screenshot = $driver.GetScreenshot()
$screenshot.SaveAsFile($filename, [System.Drawing.Imaging.ImageFormat]::Png)

Otros conductores ...

$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver
$driver = New-Object OpenQA.Selenium.Firefox.FirefoxDriver
$driver = New-Object OpenQA.Selenium.IE.InternetExplorerDriver
$driver = New-Object OpenQA.Selenium.Opera.OperaDriver
TechSpud
fuente
Probablemente mejor usar [OpenQA.Selenium.ScreenshotImageFormat]::Pngque el System.Drawingespacio de nombres.
Adarsha
4

Python - Captura de pantalla de Element:

Esta es una pregunta bastante antigua y tiene múltiples respuestas. Sin embargo, parece que falta la captura de pantalla de un elemento web en particular usando Python.

ubicación

Un elemento web tiene su propia posición en la página y generalmente se mide en píxeles x e y y se conoce como coordenadas (x, y) del elemento. Y el objeto de ubicación contiene dos valores.

  1. location ['x']: devuelve la coordenada 'x' del elemento
  2. location ['y']: devuelve la coordenada 'y' del elemento

Talla

Al igual que la ubicación, cada elemento web tiene ancho y alto; Disponible como objeto de tamaño.

  1. tamaño ['ancho'] - devuelve 'ancho' del elemento
  2. size ['height'] - devuelve 'height' del elemento

Usando coordenadas (x, y) y valores de ancho y alto, podemos recortar la imagen y almacenarla en un archivo.

from selenium import webdriver
from PIL import Image

driver = webdriver.Firefox(executable_path='[Browser Driver Path]')
driver.get('https://www.google.co.in')

element = driver.find_element_by_xpath("//div[@id='hplogo']")

location = element.location
size = element.size

driver.save_screenshot("/data/image.png")

x = location['x']
y = location['y']
width = location['x']+size['width']
height = location['y']+size['height']

im = Image.open('/data/WorkArea/image.png')
im = im.crop((int(x), int(y), int(width), int(height)))
im.save('/data/image.png')

Nota: Tomado de http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/

Arun211
fuente
¿Qué pasa con los punto y coma?
Maikflow
3

Existen múltiples métodos a través de 's y cliente para tomar una captura de pantalla usando


Métodos Java

Los siguientes son los diferentes métodos de Java para tomar una captura de pantalla :

  • Utilizando getScreenshotAs()desde la interfaz TakesScreenshot :

    • Bloque de código:

      package screenShot;
      
      import java.io.File;
      import java.io.IOException;
      
      import org.apache.commons.io.FileUtils;
      import org.openqa.selenium.OutputType;
      import org.openqa.selenium.TakesScreenshot;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.support.ui.ExpectedConditions;
      import org.openqa.selenium.support.ui.WebDriverWait;
      
      public class Firefox_takesScreenshot {
      
          public static void main(String[] args) throws IOException {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              driver.get("https://login.bws.birst.com/login.html/");
              new WebDriverWait(driver, 20).until(ExpectedConditions.titleContains("Birst"));
              File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
              FileUtils.copyFile(scrFile, new File(".\\Screenshots\\Mads_Cruz_screenshot.png"));
              driver.quit();
          }
      }
      
    • Captura de pantalla:

Mads_Cruz_screenshot

  • Si la página web está habilitada para jquery , puede usarde la biblioteca pazone / ashot :

    • Bloque de código:

      package screenShot;
      
      import java.io.File;
      import javax.imageio.ImageIO;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.support.ui.ExpectedConditions;
      import org.openqa.selenium.support.ui.WebDriverWait;
      
      import ru.yandex.qatools.ashot.AShot;
      import ru.yandex.qatools.ashot.Screenshot;
      import ru.yandex.qatools.ashot.shooting.ShootingStrategies;
      
      public class ashot_CompletePage_Firefox {
      
          public static void main(String[] args) throws Exception {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              driver.get("https://jquery.com/");
              new WebDriverWait(driver, 20).until(ExpectedConditions.titleContains("jQuery"));
              Screenshot myScreenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(100)).takeScreenshot(driver);
              ImageIO.write(myScreenshot.getImage(),"PNG",new File("./Screenshots/firefoxScreenshot.png"));
              driver.quit();
          }
      }
      
    • Captura de pantalla:

firefoxScreenshot.png

  • Utilizando de afirmar que / biblioteca de selenio-shutterbug :

    • Bloque de código:

      package screenShot;
      
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import com.assertthat.selenium_shutterbug.core.Shutterbug;
      import com.assertthat.selenium_shutterbug.utils.web.ScrollStrategy;
      
      public class selenium_shutterbug_fullpage_firefox {
      
          public static void main(String[] args) {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              driver.get("https://www.google.co.in");
              Shutterbug.shootPage(driver, ScrollStrategy.BOTH_DIRECTIONS).save("./Screenshots/");
              driver.quit();
          }
      }
      
    • Captura de pantalla:

2019_03_12_16_30_35_787.png


Métodos de Python

Los siguientes son los diferentes métodos de Python para tomar una captura de pantalla :

  • Utilizando el save_screenshot()método:

    • Bloque de código:

      from selenium import webdriver
      
      driver = webdriver.Chrome(r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("http://google.com")
      driver.save_screenshot('./Screenshots/save_screenshot_method.png')
      driver.quit()
      
    • Captura de pantalla:

save_screenshot_method.png

  • Utilizando el get_screenshot_as_file()método:

    • Bloque de código:

      from selenium import webdriver
      
      driver = webdriver.Chrome(r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("http://google.com")
      driver.get_screenshot_as_file('./Screenshots/get_screenshot_as_file_method.png')
      driver.quit()
      
    • Captura de pantalla:

get_screenshot_as_file_method.png

  • Utilizando el get_screenshot_as_png()método:

    • Bloque de código:

      from selenium import webdriver
      
      driver = webdriver.Chrome(r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("http://google.com")
      screenPnG = driver.get_screenshot_as_png()
      #Crop it back to the window size (it may be taller)
      box = (0, 0, 1366, 728)
      im = Image.open(BytesIO(screenPnG))
      region = im.crop(box)
      region.save('./Screenshots/get_screenshot_as_png_method.png', 'PNG', optimize=True, quality=95)
      driver.quit()
      
    • Captura de pantalla:

get_screenshot_as_png_method.png

DebanjanB
fuente
2

Pitón

Puede capturar la imagen desde Windows utilizando el controlador web Python. Use el código debajo de qué página necesita capturar la captura de pantalla

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
Kv.senthilkumar
fuente
44
Esta respuesta es un duplicado que se publicó varios años después de la respuesta original de Python.
Corey Goldberg
3
Además, esta respuesta no escapa a las barras diagonales inversas en el nombre de la ruta ... lo que provocará un error
Corey Goldberg
Además, le falta el código de configuración, esta línea por sí sola no funcionará.
Reducción de actividad
2

Java

public  void captureScreenShot(String obj) throws IOException {
    File screenshotFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(screenshotFile,new File("Screenshots\\"+obj+""+GetTimeStampValue()+".png"));
}

public  String GetTimeStampValue()throws IOException{
    Calendar cal = Calendar.getInstance();       
    Date time=cal.getTime();
    String timestamp=time.toString();
    System.out.println(timestamp);
    String systime=timestamp.replace(":", "-");
    System.out.println(systime);
    return systime;
}

Con estos dos métodos, también puede tomar una captura de pantalla con la fecha y la hora.

Raghuveer
fuente
2

Java

Usando RemoteWebDriver, después de aumentar el Nodo con capacidad de captura de pantalla, almacenaría la captura de pantalla de esta manera:

void takeScreenShotMethod(){
    try{
        Thread.sleep(10000);
        long id = Thread.currentThread().getId();
        BufferedImage image = new Robot().createScreenCapture(new Rectangle(
            Toolkit.getDefaultToolkit().getScreenSize()));
        ImageIO.write(image, "jpg", new File("./target/surefire-reports/"
            + id + "/screenshot.jpg"));
    }
    catch( Exception e ) {
        e.printStackTrace();
    }
}

Puede usar este método cuando sea necesario. Entonces, supongo que puede personalizar la hoja de estilo de maven-surefire-report-plugin en surefire-reports / html / custom.css para que sus informes incluyan el enlace a la captura de pantalla correcta para cada prueba.

djangofan
fuente
Hoy en día no lo haría de esta manera. Probablemente usaría un marco como Selenide.
djangofan
2

Java

String yourfilepath = "E:\\username\\Selenium_Workspace\\foldername";

// take a snapshort
File snapshort_file = ((TakesScreenshot) mWebDriver)
        .getScreenshotAs(OutputType.FILE);
// copy the file into folder

FileUtils.copyFile(snapshort_file, new File(yourfilepath));

Espero que esto resuelva tu problema

Yerram Naveen
fuente
2

C#

public static void TakeScreenshot(IWebDriver driver, String filename)
{
    // Take a screenshot and save it to filename
    Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();
    screenshot.SaveAsFile(filename, ImageFormat.Png);
}
dmeehan
fuente
2

Selenese

captureEntirePageScreenshot | /path/to/filename.png | background=#ccffdd
Bernát
fuente
2

C#

Puede usar el siguiente fragmento de código / función para tomar una captura de pantalla con el selenio:

    public void TakeScreenshot(IWebDriver driver, string path = @"output")
    {
        var cantakescreenshot = (driver as ITakesScreenshot) != null;
        if (!cantakescreenshot)
            return;
        var filename = string.Empty + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + DateTime.Now.Millisecond;
        filename = path + @"\" + filename + ".png";
        var ss = ((ITakesScreenshot)driver).GetScreenshot();
        var screenshot = ss.AsBase64EncodedString;
        byte[] screenshotAsByteArray = ss.AsByteArray;
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        ss.SaveAsFile(filename, ImageFormat.Png);
    }
Mohsin Awan
fuente
"usando System.Drawing.Imaging;" montaje.
ArNumb
Tuve que usar esta línea en la llamada SaveAsFile: ss.SaveAsFile (nombre de archivo, ScreenshotImageFormat.Png); También prefiero usar Path.Combine (carpeta, nombre de archivo) sobre la ruta + @ "\" porque se lee mejor, y creo que puede ser más indulgente con las variaciones de formato de carpeta / nombre de archivo. Preferencia personal solamente. Entonces esa línea se convierte en: filename = Path.Combine (ruta, nombre de archivo + ".png");
Desarrollador63
2

JAVA

Método para capturar Captura de pantalla para las fallas en Selenium con TestName y Timestamp adjuntos.

public class Screenshot{        
    final static String ESCAPE_PROPERTY = "org.uncommons.reportng.escape-output";
    public static String imgname = null;

    /*
     * Method to Capture Screenshot for the failures in Selenium with TestName and Timestamp appended.
     */
    public static void getSnapShot(WebDriver wb, String testcaseName) throws Exception {
      try {
      String imgpath=System.getProperty("user.dir").concat("\\Screenshot\\"+testcaseName);
      File f=new File(imgpath);
      if(!f.exists())   {
          f.mkdir();
        }   
        Date d=new Date();
        SimpleDateFormat sd=new SimpleDateFormat("dd_MM_yy_HH_mm_ss_a");
        String timestamp=sd.format(d);
        imgname=imgpath+"\\"+timestamp+".png";

        //Snapshot code
        TakesScreenshot snpobj=((TakesScreenshot)wb);
        File srcfile=snpobj.getScreenshotAs(OutputType.FILE);
        File destFile=new File(imgname);
        FileUtils.copyFile(srcfile, destFile);

      }
      catch(Exception e) {
          e.getMessage();
      }
   }
Anuj Teotia
fuente
Si esta respuesta (o alguna) le resultó útil, por favor, hágala votar. Si esto respondió a su pregunta, márquelo como la respuesta aceptada. ¡Gracias!
Anuj Teotia 01 de
1

C # (API de Ranorex)

public static void ClickButton()
{
    try
    {
        // code
    }
    catch (Exception e)
    {
        TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
        Report.Screenshot();
        throw (e);
    }
}
Benny Meade
fuente