Come fare screenshot con Selenium WebDriver


498

Qualcuno sa se è possibile fare uno screenshot usando Selenium WebDriver? (Nota: non selenio RC)


Probabilmente esiste un solo modo per farlo con il protocollo WebDriver Wire, ma nessuno utilizza direttamente questo protocollo. Invece, le persone usano associazioni / librerie di lingue diverse che avvolgono il protocollo di basso livello. Ci sono un sacco di collegamenti linguistici, quindi devi dire quale vuoi usare. Altrimenti, ci sono troppe risposte.
oberlies,

Quale linguaggio di programmazione stai usando?
Ripon Al Wasim,

Vuoi fare uno screenshot dell'intera pagina o di un elemento specifico?
Ripon Al Wasim,

Sì, è possibile fare uno screenshot dell'intera pagina o per un elemento specifico con Selenium WebDriver
Ripon Al Wasim

Risposte:


506

Giava

Sì, è possibile. Il seguente esempio è in 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"));

30
Copiare il file, piuttosto che rinominarlo, è una buona idea se c'è qualche possibilità che l'origine e la destinazione potrebbero non essere sullo stesso filesystem. Non puoi rinominare oltre i confini del filesystem (almeno su unix). Nota che è comune /tmptrovarsi sul proprio filesystem e FirefoxDriver scrive schermate /tmp.
Tom Anderson,

9
C'è un modo per farlo solo per casi falliti?
some_other_guy,

6
Vale la pena notare che HtmlUnitDrivernon implementa TakesScreenshot(vedi selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… per un elenco di driver supportati). Ma puoi salvare come HTML.
Wernight,

7
Quale pacchetto è necessario importare per l'utilizzo della classe FileUtils?
Ripon Al Wasim,

7
@RiponAlWasim probabilmenteorg.apache.commons.io.FileUtils
Ben

270

Pitone

Ogni WebDriver ha un .save_screenshot(filename)metodo. Quindi per Firefox, può essere usato in questo modo:

from selenium import webdriver

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

Confusamente, .get_screenshot_as_file(filename)esiste anche un metodo che fa la stessa cosa.

Esistono anche metodi per: .get_screenshot_as_base64()(per incorporare in html) e .get_screenshot_as_png()(per recuperare dati binari).

e Nota che WebElements ha un .screenshot()metodo che funziona in modo simile, ma cattura solo l'elemento selezionato.


Per altri browser, scambia l'istanza del webdriver. Se vuoi solo schermate del tuo sito Web compreso lo stato, dai un'occhiata a Usersnap .
Gregor,

@ DavidRöthlisberger è tutto fantastico, ma il tuo commento non ha nulla a che fare con la mia risposta
Corey Goldberg,

Per fare uno scrennshot di una pagina intera, non solo l'area visibile, utilizzare il mio codice python dalla mia risposta qui a Stich: stackoverflow.com/questions/37906704/...
Fabian Thommen

1
@CoreyGoldberg Vero, niente a che fare con la tua risposta. Ma la mia vecchia sceneggiatura utilizzava una FF più vecchia e occupava l'intera pagina, non solo il viewport. Dopo averlo cambiato in standard ora solo viewport. Quindi volevo aiutare qualcuno con lo stesso problema. E sì, gli elementi fissi sono un vero dolore in scroll / stich!
Fabian Thommen,

1
Un'altra cosa che mi ha aiutato immensamente, se è necessario modificare la dimensione dell'immagine, è sufficiente impostare la dimensione della finestra prima di scattare l'istantanea utilizzando 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;
    }
}

9
Funziona perfettamente. Avvertenza: scatta una schermata non una pagina.
ljgww,

vuoi dire che ottiene desktop e tutto il resto? O vuoi dire che ottiene solo il viewport?
vtortola,

Otterrà solo ciò che rientra nell'ambito del driver, questo per consentire l'esecuzione di più test paralleli. Nota che non si riduce se il focus della finestra principale del tuo driver ha una barra di scorrimento o se supera una singola pagina.
Ben

3
aggiornamento a SaveAsFile (percorso stringa, formato ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran

1
Questo ha funzionato per me! Stavo usando CopyFromScreen dallo spazio dei nomi della grafica. Il vantaggio della soluzione precedente è che funziona quando il codice viene chiamato in modo headless da TFS. Il mio vecchio metodo CopyFromScreen ha funzionato solo quando eseguivo i test di selenio da Visual Studio, ma non ha mai funzionato per i miei test di esecuzione 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);
   });
});

3
Simile a come lo descrive Browserstack: browserstack.com/automate/node#enhancements-screenshots
Mike Causer

in data.replace cosa stai facendo esattamente tra parentesi?
John Demetriou,

@JohnDemetriou, data è il nome dell'oggetto o della variabile che verrà creata quando la chiami. Puoi chiamarlo var1se lo desideri. Dovresti guardare la takeScreenshot()funzione per sapere di cosa si tratta esattamente. Forse un'immagine binaria resa da javascript usando canvas. Può essere il dom, prima che sia reso. Guardare dentro.
m3nda,

66

Rubino

require 'rubygems'
require 'selenium-webdriver'

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

sono disponibili più tipi di file e opzioni e li puoi vedere in takes_screenshot.rb


Ha funzionato bene per me usando Selenium Grid 2. Script e hub in esecuzione su OS X Snow Leopard; nodo in esecuzione su RedHat EL 4 con Firefox 3.6.18 in Xvfb.
MarkD

1
Esiste un modo per acquisire lo screenshot della pagina intera, non solo l'area visibile?
Arihant Godha,

2
La pagina intera è presa di default. Almeno usando headlesseFirefox
Ashley

35

Giava

Ho risolto questo problema. Puoi aumentare ilRemoteWebDriver per fornire a tutte le interfacce implementate i suoi driver proxy:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way

Se lo fai, non hai bisogno di copiare gli screenshot in un nome file con threadId in modo da poter dire quali thread / istanze del tuo driver hanno gettato lo screenshot? Altrimenti, più istanze di un browser su un nodo della griglia si sovrascriverebbero a vicenda schermate?
Djangofan,

1
Vorrei sottolineare che solo questa soluzione ha funzionato per me utilizzando ChromeDriver senza testa
GabrielRado,

34

PHP (PHPUnit)

Utilizza l'estensione PHPUnit_Selenium versione 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');
    }
    ...
}

daaaamn! Voglio saperne di più, Selenium è nuovo per me e sto cercando una soluzione cli per la creazione di schermate su un numero di browser e sistemi operativi per fare test visivi
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);
}

18

Giava

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

quale driver hai usato? nuovo 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"))

9

Java (Robot Framework)

Ho usato questo metodo per scattare una schermata.

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

È possibile utilizzare questo metodo ovunque sia richiesto.


La tua attenzione dovrebbe rimanere sempre sul browser, altrimenti scatta un'istantanea di ciò che è attualmente focalizzato.
kushal.8,

8

Giava

Sembra mancare qui - prendendo screenshot di un elemento specifico in 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);
}

Non penso che questo approccio reale possa funzionare, poiché lo screenshot e il browser attuale hanno risoluzioni diverse. Quindi, quando usi la posizione delle coordinate ottenuta dal selenio sulla tua immagine, sei quasi sicuro di imbatterti in un java.awt.image.RasterFormatException: (y + height) è al di fuori di Raster
Ichwardort,

Hai provato il codice? Ha funzionato l'ultima volta che l'ho provato.
Erki M.,

1
Funziona perfettamente fino a quando si tenta di catturare un elemento che è visibile senza scorrere. Quando è necessario scorrere fino a un elemento per catturarlo, l'offset y viene calcolato dalla parte superiore della pagina, che quindi supera i limiti dell'immagine a schermo intero. Quindi la soluzione più semplice è aumentare la dimensione dello schermo codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); o per rimuovere eventuali elementi non richiesti tramite css. La soluzione corretta sarebbe quella di calcolare l'offset y dallo scorrimento.
Ichwardort,

1
Nel Firefoxfunziona bene come si ritaglia lo schermo elemento dalla piena immagine in base alle dimensioni. In Chromese l'elemento è disponibile in porzione guarda con fuori scorrimento l'immagine da quella vista porzione cattura elemento soddisfacente. Se vogliamo fare screenshot dopo aver fatto scorrere document.documentElement.clientHeightdue volte l'altezza del client l'uso (location.y)-2*clientHeightper ottenere lo screenshot dell'elemento esatto. Grazie per questo post perché mi aiuta ...
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();
        }
    }
}

Richiede pacchetti NuGet:

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

Testato con .NETFramework v4.5.2


5

Giava

Non sono riuscito a far funzionare la risposta accettata, ma secondo l'attuale documentazione di WebDriver , per Java 7 su OS X 10.9 funzionava perfettamente con me:

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

4

Ruby (Cetriolo)

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

Che lingua è questa?
codygman,

Sembra rubino, non utilizza alcun driver web specifico
James,

4

Rubino

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

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

nella versione corrente di facebook / webdriver il metodo è takeScreenshot () e non è necessario base64_encode () l'output prima di salvare il file.
Billrichards,

1
Potresti aggiungere un codice al tuo esempio che mostra come chiamare questa takescreenshotfunzione? In particolare da dove viene la $eventvariabile? Sono un noob completo del selenio, quindi una risposta a questa domanda che non presuppone una conoscenza precedente del selenio sarebbe molto apprezzata!
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)

Altri driver ...

$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

Probabilmente migliore da usare [OpenQA.Selenium.ScreenshotImageFormat]::Pngrispetto allo System.Drawingspazio dei nomi.
Adarsha,

4

Python - Screenshot di Element:

Questa è una domanda piuttosto vecchia e ha più risposte. Tuttavia sembra che qui manchi lo screenshot di un particolare elemento web usando Python.

Posizione

Un elemento web ha una propria posizione sulla pagina e generalmente viene misurato in pixel xey e noto come coordinate (x, y) dell'elemento. E l'oggetto location contiene due valori.

  1. location ['x'] - restituisce la coordinata 'x' dell'elemento
  2. location ['y'] - restituisce la coordinata 'y' dell'elemento

dimensione

Come la posizione, ogni WebElement ha larghezza e altezza; Disponibile come oggetto dimensioni.

  1. size ['larghezza'] - restituisce 'larghezza' dell'elemento
  2. size ['height'] - restituisce 'height' dell'elemento

Usando le coordinate (x, y) e i valori di larghezza, altezza, possiamo ritagliare l'immagine e salvarla in un file.

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: tratto da http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/


Che cosa sono i punti e virgola?
Maikflow,

3

Esistono diversi metodi 'S e client per fare uno screenshot usando


Metodi Java

Di seguito sono riportati i diversi metodi Java per acquisire uno screenshot :

  • Utilizzo getScreenshotAs()dall'interfaccia TakesScreenshot :

    • Blocco di codice:

      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();
          }
      }
      
    • Immagine dello schermo:

Mads_Cruz_screenshot

  • Se la pagina Web è jquery abilitata per è possibile utilizzaredalla libreria pazone / ashot :

    • Blocco di codice:

      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();
          }
      }
      
    • Immagine dello schermo:

firefoxScreenshot.png

  • utilizzando da assertthat / selenium-shutterbug library:

    • Blocco di codice:

      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();
          }
      }
      
    • Immagine dello schermo:

2019_03_12_16_30_35_787.png


Metodi Python

Di seguito sono riportati i diversi metodi Python per acquisire uno screenshot :

  • Utilizzando il save_screenshot()metodo:

    • Blocco di codice:

      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()
      
    • Immagine dello schermo:

save_screenshot_method.png

  • Utilizzando il get_screenshot_as_file()metodo:

    • Blocco di codice:

      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()
      
    • Immagine dello schermo:

get_screenshot_as_file_method.png

  • Utilizzando il get_screenshot_as_png()metodo:

    • Blocco di codice:

      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()
      
    • Immagine dello schermo:

get_screenshot_as_png_method.png


2

Pitone

È possibile acquisire l'immagine da Windows utilizzando il driver Web Python. Usa il codice sotto la pagina in cui devi catturare lo screenshot

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')

4
questa risposta è un duplicato pubblicato diversi anni dopo la risposta originale di Python.
Corey Goldberg,

3
inoltre, questa risposta non sfugge alle barre rovesciate nel nome del percorso .. che causerà un errore
Corey Goldberg,

Inoltre, manca il codice di installazione, questa riga da sola non funzionerà.
riduzione dell'attività

2

Giava

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

Usando questi due metodi puoi anche fare uno screenshot con la data e l'ora.


2

Giava

Usando RemoteWebDriver, dopo aver aumentato il nodo con funzionalità di screenshot, memorizzerei lo screenshot in questo modo:

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

È possibile utilizzare questo metodo ovunque sia richiesto. Quindi, presumo che tu possa personalizzare il foglio di stile di maven-surefire-report-plugin su surefire-reports / html / custom.css in modo che i tuoi rapporti includano il link allo screenshot corretto per ogni test?


Oggi non lo farei in questo modo. Vorrei usare un framework come Selenide probabilmente.
Djangofan,

2

Giava

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

spero che questo risolva il tuo problema


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

2

Selenese

captureEntirePageScreenshot | /path/to/filename.png | background=#ccffdd

2

C #

Puoi usare il seguente frammento di codice / funzione per fare screenshot con il 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);
    }

"using System.Drawing.Imaging;" montaggio.
ArNumb,

Ho dovuto usare questa linea nella chiamata SaveAsFile: ss.SaveAsFile (nomefile, ScreenshotImageFormat.Png); Preferisco anche usare Path.Combine (cartella, nome file) sul percorso + @ "\" perché legge meglio, e penso che potrebbe essere più tollerante di formattazione.variazioni cartella / nome file. Solo preferenze personali. Quindi quella linea diventa: nomefile = Path.Combine (percorso, nomefile + ".png");
Developer63


2

GIAVA

Metodo per acquisire screenshot per gli errori in Selenium con TestName e Timestamp aggiunti.

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

Se hai trovato utile questa (o una qualsiasi) risposta, per favore votala. Se questo ha risposto alla tua domanda, contrassegnala come risposta accettata. Grazie!
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);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.