Comment faire une capture d'écran avec Selenium WebDriver

498

Est-ce que quelqu'un sait s'il est possible de faire une capture d'écran en utilisant Selenium WebDriver? (Remarque: pas Selenium RC)

James Hollingworth
la source
Il n'y a probablement qu'une seule façon de le faire avec le protocole WebDriver Wire, mais personne n'utilise directement ce protocole. Au lieu de cela, les gens utilisent différentes liaisons / bibliothèques de langage qui enveloppent le protocole de bas niveau. Il existe de nombreuses liaisons de langue, vous devez donc indiquer celle que vous souhaitez utiliser. Sinon, il y a tout simplement trop de réponses.
oberlies
Quel langage de programmation utilisez-vous?
Ripon Al Wasim
Voulez-vous faire une capture d'écran de la page entière ou d'un élément spécifique?
Ripon Al Wasim
Oui, il est possible de prendre une capture d'écran de la page entière ou d'un élément spécifique avec Selenium WebDriver
Ripon Al Wasim

Réponses:

506

Java

Oui c'est possible. L'exemple suivant 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
la source
30
Copier le fichier, plutôt que de le renommer, est une bonne idée s'il y a une chance que la source et la destination ne soient pas sur le même système de fichiers. Vous ne pouvez pas renommer au-delà des limites du système de fichiers (sous Unix, au moins). Notez qu'il est courant /tmpd'être sur son propre système de fichiers et FirefoxDriver écrit des captures d'écran /tmp.
Tom Anderson
9
Existe-t-il un moyen de le faire uniquement pour les cas ayant échoué?
some_other_guy
6
Il convient de noter que cette fonctionnalité HtmlUnitDrivern'est pas implémentée TakesScreenshot(voir selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… pour une liste des pilotes pris en charge). Mais vous pouvez enregistrer au format HTML.
Wernight
7
Quel package est requis pour importer pour utiliser la classe FileUtils?
Ripon Al Wasim
7
@RiponAlWasim probablementorg.apache.commons.io.FileUtils
Ben
270

Python

Chaque WebDriver a une .save_screenshot(filename)méthode. Donc pour Firefox, il peut être utilisé comme ceci:

from selenium import webdriver

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

Confusément, .get_screenshot_as_file(filename)il existe également une méthode qui fait la même chose.

Il existe également des méthodes pour: .get_screenshot_as_base64()(pour l'intégration en html) et .get_screenshot_as_png()(pour la récupération de données binaires).

et Notez que les WebElements ont une .screenshot()méthode qui fonctionne de manière similaire, mais ne capture que l'élément sélectionné.

Corey Goldberg
la source
Pour les autres navigateurs, échangez l'instance de pilote Web. Si vous voulez juste des captures d'écran de votre site Web, y compris l'état, jetez un œil à Usersnap .
Gregor
@ DavidRöthlisberger c'est très bien, mais votre commentaire n'a rien à voir avec ma réponse
Corey Goldberg
Pour faire un aperçu d'une page complète, pas seulement la zone visible, utilisez mon code python de ma réponse ici pour stich: stackoverflow.com/questions/37906704/…
Fabian Thommen
1
@CoreyGoldberg Vrai, rien à voir avec votre réponse. Mais mon ancien script utilisait un ancien FF et cela prenait toute la page, pas seulement la fenêtre d'affichage. Après l'avoir changé en standard, seule la fenêtre est désormais disponible. Je voulais donc aider quelqu'un ayant le même problème. Et oui, les éléments fixes sont vraiment pénibles en scroll / stich!
Fabian Thommen
1
Une dernière chose qui m'a énormément aidé, si vous avez besoin de changer la dimension de l'image, définissez simplement la taille de la fenêtre avant de prendre l'instantané avec 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
la source
9
Marche parfaitement. Avertissement: prend une capture d'écran et non une capture de page.
ljgww
voulez-vous dire qu'il obtient le bureau et tout? Ou vous voulez dire qu'il obtient juste la fenêtre d'affichage?
vtortola
Il n'obtiendra que ce qui est dans la portée du pilote, c'est pour permettre plusieurs tests parallèles en cours. Notez qu'il ne fera pas de zoom arrière si le focus de la fenêtre principale de votre pilote a une barre de défilement ou s'il dépasse une seule page.
Ben
3
mise à jour vers SaveAsFile (chemin de chaîne, format ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran
1
Cela a fonctionné pour moi! J'utilisais CopyFromScreen de l'espace de noms Graphics. L'avantage de la solution ci-dessus est qu'elle fonctionne lorsque le code est appelé sans tête depuis TFS. Mon ancienne méthode CopyFromScreen ne fonctionnait que lors de l'exécution de tests au sélénium à partir de Visual Studio mais n'a jamais fonctionné pour mes tests d'exécution 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
la source
3
Semblable à la façon dont Browserstack décrit: browserstack.com/automate/node#enhancements-screenshots
Mike Causer
dans data.replace que faites-vous exactement entre parenthèses?
John Demetriou
@JohnDemetriou, data est le nom de l'objet ou de la variable qui sera créé lorsque vous l'appellerez. Vous pouvez l'appeler var1si vous le souhaitez. U devrait regarder la takeScreenshot()fonction pour savoir exactement ce que c'est. Peut-être une image binaire rendue à partir de javascript en utilisant canvas. Ce peut être le dom, avant qu'il ne soit rendu. Examiner.
m3nda
66

Rubis

require 'rubygems'
require 'selenium-webdriver'

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

plus de types de fichiers et d'options sont disponibles et vous pouvez les voir dans takes_screenshot.rb

sirclesam
la source
Fonctionné très bien pour moi en utilisant Selenium Grid 2. Script et hub fonctionnant sur OS X Snow Leopard; nœud fonctionnant sur RedHat EL 4 avec Firefox 3.6.18 sous Xvfb.
MarkD
1
Existe-t-il un moyen de prendre la capture d'écran en pleine page, pas seulement la zone visible?
Arihant Godha
2
La page entière est prise par défaut. Au moins en utilisant headlessetFirefox
Ashley
35

Java

J'ai résolu ce problème. Vous pouvez augmenter le RemoteWebDriverpour lui donner toutes les interfaces que son pilote mandataire implémente:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
user708910
la source
Si vous faites cela, n'avez-vous pas besoin de copier les captures d'écran dans un nom de fichier avec threadId afin de savoir quels threads / instances de votre pilote ont lancé la capture d'écran? Sinon, plusieurs instances d'un navigateur sur un nœud de grille se remplaceraient les captures d'écran?
djangofan
1
Je voudrais souligner que seule cette solution a fonctionné pour moi en utilisant ChromeDriver sans tête
GabrielRado
34

PHP (PHPUnit)

Utilise l'extension PHPUnit_Selenium version 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
la source
daaaamn! Je veux en savoir plus à ce sujet, Selenium est nouveau pour moi et je suis à la recherche d'une solution cli pour créer des captures d'écran sur un certain nombre de navigateurs et de systèmes d'exploitation pour faire des tests visuels
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
la source
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
la source
quel pilote avez-vous utilisé? nouvel 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"))
Esprit frais
la source
9

Java (Robot Framework)

J'ai utilisé cette méthode pour prendre une capture d'écran.

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();
    }
}

Vous pouvez utiliser cette méthode si nécessaire.

ank
la source
Votre attention doit rester sur le navigateur tout le temps, sinon vous prenez un instantané de tout ce qui est actuellement concentré.
kushal.8
8

Java

Semble manquer ici - prendre une capture d'écran d'un élément spécifique 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.
la source
Je ne pense pas que cette approche puisse fonctionner, car la capture d'écran et le navigateur réel ont des résolutions différentes. Donc, lorsque vous utilisez l'emplacement de coordonnées obtenu par le sélénium sur votre image, vous êtes presque sûr de rencontrer une java.awt.image.RasterFormatException: (y + hauteur) est en dehors de Raster
Ichwardort
Avez-vous essayé le code? Cela a fonctionné lors de mon dernier essai.
Erki M.
1
Cela fonctionne parfaitement bien tant que vous essayez de capturer un élément qui est visible sans défilement. Lorsque vous devez faire défiler jusqu'à un élément pour le capturer, le décalage y est calculé à partir du haut de la page, qui dépasse ensuite les limites de l'image en plein écran. La solution la plus simple consiste donc à augmenter la taille de l'écran codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); ou pour supprimer tous les éléments non requis via css. La bonne solution serait de calculer le décalage y du défilement.
Ichwardort
1
En Firefoxfonctionne très bien car il recadre l'écran de l'élément à partir de l'image complète basée sur les dimensions. En Chromesi l'élément est disponible dans la partie de vue avec défilement sur la partie de cette vue image qu'elle capture bien l' élément. Si nous voulons prendre une capture d'écran après avoir fait défiler document.documentElement.clientHeightdeux fois la hauteur du client, utilisez (location.y)-2*clientHeightpour obtenir la capture d'écran exacte de l'élément. Merci pour ce message car il m'aide ...
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();
        }
    }
}

Nécessite NuGetPackages:

  1. PhantomJS 2.0.0
  2. Selenium.Support 2.48.2
  3. Selenium.WebDriver 2.48.2

Testé avec .NETFramework v4.5.2

userlond
la source
5

Java

Je n'ai pas pu obtenir la réponse acceptée au travail, mais selon la documentation WebDriver actuelle , les éléments suivants ont bien fonctionné pour moi avec Java 7 sur 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
la source
4

Rubis (concombre)

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
la source
Quelle langue est-ce?
codygman
Cela ressemble à son en rubis, n'utilisant aucun pilote Web spécifique
James
4

Rubis

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
la source
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
la source
dans la version actuelle de facebook / webdriver, la méthode est takeScreenshot () et il n'est pas nécessaire de base64_encode () la sortie avant d'enregistrer le fichier.
billrichards
1
Pourriez-vous s'il vous plaît ajouter à votre exemple un code qui montre comment appeler cette takescreenshotfonction? Plus précisément, d'où vient la $eventvariable? Je suis un noob complet en sélénium, donc une réponse à cette question qui ne suppose pas une connaissance préalable du sélénium serait très appréciée!
Kenny83
4

PowerShell

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)

Autres pilotes ...

$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
la source
Probablement mieux à utiliser [OpenQA.Selenium.ScreenshotImageFormat]::Pngque l' System.Drawingespace de noms.
Adarsha
4

Python - Capture d'écran d'Element:

Il s'agit d'une assez vieille question qui a plusieurs réponses. Cependant, il semble que la capture d'écran d'un élément Web particulier utilisant Python manque ici.

emplacement

Un élément Web a sa propre position sur la page et est généralement mesuré en pixels x et y et connu sous le nom de coordonnées d'élément (x, y). Et l'objet de localisation contient deux valeurs.

  1. location ['x'] - retourne la coordonnée 'x' de l'élément
  2. location ['y'] - retourne la coordonnée 'y' de l'élément

Taille

Comme l'emplacement, chaque WebElement a une largeur et une hauteur; Disponible comme objet de taille.

  1. size ['width'] - renvoie la 'largeur' de l'élément
  2. size ['height'] - renvoie la 'hauteur' de l'élément

En utilisant les coordonnées (x, y) et les valeurs de largeur, hauteur, nous pouvons recadrer l'image et la stocker dans un fichier.

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')

Remarque: Extrait de http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/

Arun211
la source
Qu'est-ce que les points-virgules?
Maikflow
3

Il existe plusieurs méthodes à travers c'est et client pour prendre une capture d'écran à l' aide


Méthodes Java

Voici les différentes méthodes Java pour faire une capture d'écran :

  • Utilisation getScreenshotAs()de l' interface TakesScreenshot :

    • Bloc de code:

      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();
          }
      }
      
    • Capture d'écran:

Mads_Cruz_screenshot

  • Si la page Web est jquery compatible avec vous pouvez utiliserde la bibliothèque pazone / ashot :

    • Bloc de code:

      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();
          }
      }
      
    • Capture d'écran:

firefoxScreenshot.png

  • En utilisant à partir de la bibliothèque assertthat / selenium-shutterbug :

    • Bloc de code:

      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();
          }
      }
      
    • Capture d'écran:

2019_03_12_16_30_35_787.png


Méthodes Python

Voici les différentes méthodes Python pour prendre une capture d'écran :

  • En utilisant la save_screenshot()méthode:

    • Bloc de code:

      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()
      
    • Capture d'écran:

save_screenshot_method.png

  • En utilisant la get_screenshot_as_file()méthode:

    • Bloc de code:

      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()
      
    • Capture d'écran:

get_screenshot_as_file_method.png

  • En utilisant la get_screenshot_as_png()méthode:

    • Bloc de code:

      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()
      
    • Capture d'écran:

get_screenshot_as_png_method.png

DebanjanB
la source
2

Python

Vous pouvez capturer l'image à partir de Windows à l'aide du pilote Web Python. Utilisez le code ci-dessous quelle page doit capturer la capture d'écran

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
Kv.senthilkumar
la source
4
cette réponse est un doublon qui a été publié plusieurs années après la réponse Python d'origine.
Corey Goldberg
3
aussi, cette réponse n'échappe pas aux barres obliques inverses dans le nom du chemin .. ce qui provoquera une erreur
Corey Goldberg
En outre, il manque le code d'installation, cette ligne en elle-même ne fonctionnera pas.
réduction de l'activité
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;
}

En utilisant ces deux méthodes, vous pouvez également prendre une capture d'écran avec la date et l'heure.

Raghuveer
la source
2

Java

En utilisant RemoteWebDriver, après avoir augmenté le Node avec une capacité de capture d'écran, je stockerais la capture d'écran comme suit:

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();
    }
}

Vous pouvez utiliser cette méthode si nécessaire. Ensuite, je suppose que vous pouvez personnaliser la feuille de style de maven-surefire-report-plugin sur surefire-reports / html / custom.css afin que vos rapports incluent le lien vers la capture d'écran correcte pour chaque test?

djangofan
la source
De nos jours, je ne le ferais pas de cette façon. J'utiliserais probablement un framework comme 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));

J'espère que ceci résoudra votre problème

Yerram Naveen
la source
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
la source
2

Sélénien

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

C #

Vous pouvez utiliser l'extrait de code / la fonction suivante pour prendre une capture d'écran avec le sélénium:

    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
la source
"using System.Drawing.Imaging;" Assemblée.
ArNumb
J'ai dû utiliser cette ligne dans l'appel SaveAsFile: ss.SaveAsFile (nom de fichier, ScreenshotImageFormat.Png); Je préfère également utiliser Path.Combine (dossier, nom de fichier) sur le chemin + @ "\" car il lit mieux, et je pense qu'il peut être plus indulgent pour le dossier / nom de fichier formating.variations. Préférence personnelle uniquement. Cette ligne devient donc: filename = Path.Combine (path, filename + ".png");
Developer63
2

JAVA

Méthode de capture d'écran pour les échecs dans Selenium avec TestName et Timestamp ajoutés.

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
la source
Si vous avez trouvé cette réponse (ou toute autre) utile, veuillez la voter. Si cela répond à votre question, veuillez la marquer comme réponse acceptée. Merci!
Anuj Teotia
1

C # (API Ranorex)

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