So machen Sie einen Screenshot mit Selenium WebDriver

499

Weiß jemand, ob es möglich ist, mit Selenium WebDriver einen Screenshot zu machen? (Hinweis: Nicht Selen RC)

James Hollingworth
quelle
Es gibt wahrscheinlich nur einen Weg, dies mit dem WebDriver Wire Protocol zu tun, aber niemand verwendet dieses Protokoll direkt. Stattdessen verwenden Benutzer unterschiedliche Sprachbindungen / Bibliotheken, die das Low-Level-Protokoll umschließen. Es gibt viele Sprachbindungen, daher müssen Sie angeben, welche Sie verwenden möchten. Ansonsten gibt es einfach zu viele Antworten.
Oberlies
Welche Programmiersprache verwenden Sie?
Ripon Al Wasim
Möchten Sie einen Screenshot der gesamten Seite oder eines bestimmten Elements machen?
Ripon Al Wasim
Ja, es ist möglich, mit Selenium WebDriver
Ripon Al Wasim

Antworten:

507

Java

Ja, es ist möglich. Das folgende Beispiel ist 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"));
Sergii Pozharov
quelle
30
Das Kopieren der Datei, anstatt sie umzubenennen, ist eine gute Idee, wenn die Möglichkeit besteht, dass sich Quelle und Ziel möglicherweise nicht im selben Dateisystem befinden. Sie können nicht über Dateisystemgrenzen hinweg umbenennen (zumindest unter Unix). Beachten Sie, dass es üblich ist /tmp, sich in einem eigenen Dateisystem zu befinden, und FirefoxDriver schreibt Screenshots in /tmp.
Tom Anderson
9
Gibt es eine Möglichkeit, dies nur für fehlgeschlagene Fälle zu tun?
some_other_guy
6
Es ist erwähnenswert, dass HtmlUnitDrivernicht implementiert TakesScreenshot(siehe selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/... für eine Liste der unterstützten Treiber). Sie können aber als HTML speichern.
Wernight
7
Welches Paket muss importiert werden, um die FileUtils-Klasse zu verwenden?
Ripon Al Wasim
7
@RiponAlWasim wahrscheinlichorg.apache.commons.io.FileUtils
Ben
269

Python

Jeder WebDriver verfügt über eine .save_screenshot(filename)Methode. Für Firefox kann es also folgendermaßen verwendet werden:

from selenium import webdriver

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

Verwirrenderweise gibt es auch eine .get_screenshot_as_file(filename)Methode, die dasselbe tut.

Es gibt auch Methoden für: .get_screenshot_as_base64()(zum Einbetten in HTML) und .get_screenshot_as_png()(zum Abrufen von Binärdaten).

und Beachten Sie, dass WebElements über eine .screenshot()Methode verfügen , die ähnlich funktioniert, jedoch nur das ausgewählte Element erfasst.

Corey Goldberg
quelle
Tauschen Sie für andere Browser die Webdriver-Instanz aus. Wenn Sie nur Screenshots Ihrer Website einschließlich des Status wünschen, schauen Sie sich Usersnap an .
Gregor
@ DavidRöthlisberger das ist alles großartig, aber Ihr Kommentar hat nichts mit meiner Antwort zu tun
Corey Goldberg
Um einen Scrennshot einer ganzen Seite zu machen, nicht nur des sichtbaren Bereichs, verwenden Sie meinen Python-Code aus meiner Antwort hier an stich
Fabian Thommen
1
@CoreyGoldberg Stimmt, nichts mit deiner Antwort zu tun. Aber mein altes Skript verwendete ein älteres FF und es dauerte die ganze Seite, nicht nur das Ansichtsfenster. Nachdem sie es auf Standard geändert hatten, jetzt nur noch das Ansichtsfenster. Also wollte ich jemandem helfen, der das gleiche Problem hat. Und ja, festes Element ist ein echter Schmerz in Scroll / Stich!
Fabian Thommen
1
Eine weitere Sache, die mir sehr geholfen hat: Wenn Sie die Bildgröße ändern müssen, stellen Sie einfach die Fenstergröße ein, bevor Sie den Schnappschuss mit verwenden 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
quelle
9
Funktioniert perfekt. Vorsichtsmaßnahme: Nimmt einen Screenshot auf, keinen Seitenschuss.
ljgww
Meinst du, es wird Desktop und alles? Oder meinst du, dass es nur das Ansichtsfenster bekommt?
Vtortola
Es wird nur das bekommen, was im Umfang des Treibers liegt, um mehrere parallele Tests zu ermöglichen. Beachten Sie, dass es nicht verkleinert wird, wenn der Fokus des Hauptfensters Ihres Treibers über eine Bildlaufleiste verfügt oder eine einzelne Seite überschreitet.
Ben
3
Update auf SaveAsFile (String-Pfad, ScreenshotImageFormat-Format) ScreenshotImageFormat.Jpeg
Kieran
1
Das hat bei mir funktioniert! Ich habe CopyFromScreen aus dem Graphics-Namespace verwendet. Der Vorteil der obigen Lösung besteht darin, dass sie funktioniert, wenn der Code von TFS kopflos aufgerufen wird. Meine alte CopyFromScreen-Methode funktionierte nur beim Ausführen von Selentests in Visual Studio, jedoch nie bei meinen TFS-Ausführungstests.
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
quelle
3
Ähnlich wie Browserstack es beschreibt: browsererstack.com/automate/node#enhancements-screenshots
Mike Causer
in data.replace was genau machst du in der Klammer?
John Demetriou
@JohnDemetriou, data ist der Name des Objekts oder der Variablen, die beim Aufruf erstellt werden. Sie können es anrufen, var1wenn Sie möchten. Sie sollten sich die takeScreenshot()Funktion ansehen, um zu wissen, was genau sie ist. Möglicherweise ein Binärbild, das aus Javascript mit Leinwand gerendert wurde. Es kann der Dom sein, bevor er gerendert wird. Einblick in.
m3nda
66

Rubin

require 'rubygems'
require 'selenium-webdriver'

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

Weitere Dateitypen und Optionen sind verfügbar und Sie können sie in take_screenshot.rb sehen

Sirclesam
quelle
Hat mit Selenium Grid 2 gut funktioniert. Skript und Hub laufen unter OS X Snow Leopard. Knoten, der unter RedHat EL 4 mit Firefox 3.6.18 unter Xvfb ausgeführt wird.
MarkD
1
Gibt es eine Möglichkeit, den ganzseitigen Screenshot zu erstellen, nicht nur den sichtbaren Bereich?
Arihant Godha
2
Die ganze Seite wird standardmäßig verwendet. Zumindest mit headlessundFirefox
Ashley
35

Java

Ich habe dieses Problem behoben. Sie können das erweitern RemoteWebDriver, um ihm alle Schnittstellen zu geben, die der Proxy-Treiber implementiert:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
user708910
quelle
Wenn Sie dies tun, müssen Sie dann keine Screenshots mit threadId in einen Dateinamen kopieren, damit Sie erkennen können, welche Threads / Instanzen Ihres Treibers den Screenshot geworfen haben? Andernfalls würden mehrere Instanzen eines Browsers auf einem Grid-Knoten die Screenshots der anderen überschreiben.
Djangofan
1
Ich möchte darauf hinweisen, dass nur diese Lösung für mich mit kopflosem ChromeDriver
GabrielRado
34

PHP (PHPUnit)

Verwendet die PHPUnit_Selenium-Erweiterung 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
quelle
daaaamn! Ich möchte mehr darüber wissen, Selenium ist neu für mich und ich suche nach einer CLI-Lösung zum Erstellen von Screenshots in einer Reihe von Browsern und Betriebssystemen, um visuelle Tests durchzuführen
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
quelle
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
quelle
Welchen Treiber haben Sie verwendet? neuer Augmenter (). augmenter (Treiber);
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"))
Frischer Geist
quelle
9

Java (Robot Framework)

Ich habe diese Methode verwendet, um einen Screenshot zu machen.

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

Sie können diese Methode verwenden, wo immer dies erforderlich ist.

ank
quelle
Ihr Fokus sollte die ganze Zeit auf dem Browser bleiben, sonst macht er eine Momentaufnahme von allem, was gerade fokussiert ist.
Kushal.8
8

Java

Scheint hier zu fehlen - Screenshot eines bestimmten Elements in Java machen:

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.
quelle
Ich denke nicht, dass dieser Ansatz tatsächlich funktionieren kann, da der Screenshot und der tatsächliche Browser unterschiedliche Auflösungen haben. Wenn Sie also die durch Selen erhaltene Koordinatenposition auf Ihrem Bild verwenden, werden Sie mit ziemlicher Sicherheit auf eine java.awt.image.RasterFormatException stoßen: (y + height) befindet sich außerhalb von Raster
Ichwardort
Hast du den Code ausprobiert? Es hat funktioniert, als ich es das letzte Mal versucht habe.
Erki M.
1
Es funktioniert einwandfrei, solange Sie versuchen, ein Element zu erfassen, das ohne Scrollen sichtbar ist. Wenn Sie zu einem Element scrollen müssen, um es zu erfassen, wird der y-Versatz vom oberen Rand der Seite berechnet, der dann die Grenzen des Vollbilds überschreitet. Die einfachste Lösung besteht also darin, entweder die Bildschirmgröße zu erhöhen codethis.driver.manage (). Window (). SetSize (neue Dimension (1680, 1050)); oder um nicht benötigte Elemente über CSS zu entfernen. Die richtige Lösung wäre, den y-Versatz vom Scrollen zu berechnen.
Ichwardort
1
In Firefoxfunktioniert einwandfrei, da der Elementbildschirm basierend auf den Abmessungen aus dem Vollbild ausgeschnitten wird. In Chromewenn das Element im Hinblick Teil vorhanden ist mit aus dem aus dieser Sicht Teil Bild Scrollen fängt es Element in Ordnung. Wenn wir einen Screenshot machen möchten, nachdem Sie document.documentElement.clientHeightzweimal durch die Client-Höhe gescrollt haben, verwenden Sie diese Option (location.y)-2*clientHeight, um einen genauen Element-Screenshot zu erhalten. Vielen Dank für diesen Beitrag, wie es mir hilft ...
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();
        }
    }
}

Benötigt NuGetPackages:

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

Getestet mit .NETFramework v4.5.2

userlond
quelle
5

Java

Ich konnte die akzeptierte Antwort nicht zum Laufen bringen, aber gemäß der aktuellen WebDriver-Dokumentation funktionierte Folgendes mit Java 7 unter OS X 10.9 einwandfrei:

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
quelle
4

Rubin (Gurke)

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
quelle
Welche Sprache ist das?
Codygman
Dies sieht aus wie in Ruby, ohne einen bestimmten Webtreiber zu verwenden
James
4

Rubin

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
quelle
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
quelle
In der aktuellen Version von Facebook / Webdriver lautet die Methode takeScreenshot () und es ist nicht erforderlich, die Ausgabe vor dem Speichern der Datei mit base64_encode () zu versehen.
Billrichards
1
Könnten Sie bitte Ihrem Beispiel Code hinzufügen, der zeigt, wie diese takescreenshotFunktion aufgerufen wird? Woher kommt die $eventVariable? Ich bin ein kompletter Selenium-Neuling, daher wäre eine Antwort auf diese Frage, die keine Selenium-Vorkenntnisse voraussetzt, sehr willkommen!
Kenny83
4

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

Andere Fahrer ...

$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
quelle
Wahrscheinlich besser zu verwenden [OpenQA.Selenium.ScreenshotImageFormat]::Pngals System.DrawingNamespace.
Adarsha
4

Python - Screenshot von Element:

Dies ist eine ziemlich alte Frage und hat mehrere Antworten. Es scheint jedoch, dass hier ein Screenshot eines bestimmten Webelements mit Python fehlt.

Standort

Ein Webelement hat seine eigene Position auf der Seite und wird im Allgemeinen in x- und y-Pixeln gemessen und als (x, y) -Koordinaten des Elements bezeichnet. Das Standortobjekt enthält zwei Werte.

  1. location ['x'] - Gibt die 'x'-Koordinate des Elements zurück
  2. location ['y'] - Gibt die 'y'-Koordinate des Elements zurück

Größe

Wie der Standort hat jedes WebElement Breite und Höhe. Verfügbar als Größenobjekt.

  1. size ['width'] - Gibt 'width' des Elements zurück
  2. size ['height'] - gibt 'height' des Elements zurück

Mit (x, y) -Koordinaten und Werten für Breite und Höhe können wir das Bild zuschneiden und in einer Datei speichern.

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

Hinweis: Entnommen aus http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/

Arun211
quelle
Was ist mit den Semikolons?
Maikflow
3

Es gibt mehrere Methoden durch 's und Client, um einen Screenshot zu machen mit zu machen


Java-Methoden

Im Folgenden sind die verschiedenen Java- Methoden aufgeführt, um einen Screenshot zu erstellen :

  • Verwenden getScreenshotAs()der TakesScreenshot-Oberfläche :

    • Codeblock:

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

Mads_Cruz_screenshot

  • Wenn die Webseite ist jquery aktiviert Sie verwenden können ,aus der pazone / ashot Bibliothek:

    • Codeblock:

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

FirefoxScreenshot.png

  • Verwenden von aus der Behauptung, dass / Selen-Shutterbug- Bibliothek:

    • Codeblock:

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

2019_03_12_16_30_35_787.png


Python-Methoden

Im Folgenden finden Sie die verschiedenen Python- Methoden, um einen Screenshot zu erstellen :

  • Mit save_screenshot()Methode:

    • Codeblock:

      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()
      
    • Bildschirmfoto:

save_screenshot_method.png

  • Mit get_screenshot_as_file()Methode:

    • Codeblock:

      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()
      
    • Bildschirmfoto:

get_screenshot_as_file_method.png

  • Mit get_screenshot_as_png()Methode:

    • Codeblock:

      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()
      
    • Bildschirmfoto:

get_screenshot_as_png_method.png

DebanjanB
quelle
2

Python

Sie können das Bild aus Windows mit dem Python-Webtreiber aufnehmen. Verwenden Sie den Code unter der Seite, auf der der Screenshot aufgenommen werden soll

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
Kv.senthilkumar
quelle
4
Diese Antwort ist ein Duplikat, das einige Jahre nach der ursprünglichen Python-Antwort veröffentlicht wurde.
Corey Goldberg
3
Außerdem entgeht diese Antwort keinen Backslashes im Pfadnamen. Dies führt zu einem Fehler
Corey Goldberg,
Außerdem fehlt der Setup-Code, diese Zeile selbst funktioniert nicht.
Reduzierung der Aktivität
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;
}

Mit diesen beiden Methoden können Sie auch einen Screenshot mit Datum und Uhrzeit erstellen.

Raghuveer
quelle
2

Java

Mit RemoteWebDriver würde ich den Screenshot nach dem Erweitern des Knotens mit Screenshot-Funktionen folgendermaßen speichern:

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

Sie können diese Methode verwenden, wo immer dies erforderlich ist. Dann gehe ich davon aus, dass Sie das Stylesheet des Maven-Surefire-Report-Plugins unter Surefire-Reports / html / custom.css so anpassen können, dass Ihre Berichte den Link zum richtigen Screenshot für jeden Test enthalten.

Djangofan
quelle
Heutzutage würde ich es nicht so machen. Ich würde wahrscheinlich ein Framework wie Selenide verwenden.
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));

Hoffe das löst dein Problem

Yerram Naveen
quelle
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
quelle
2

Selenese

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

C #

Sie können das folgende Code-Snippet / die folgende Funktion verwenden, um einen Screenshot mit dem Selen zu erstellen:

    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
quelle
"using System.Drawing.Imaging;" Versammlung.
ArNumb
Ich musste diese Zeile im SaveAsFile-Aufruf verwenden: ss.SaveAsFile (Dateiname, ScreenshotImageFormat.Png); Ich bevorzuge es auch, Path.Combine (Ordner, Dateiname) über dem Pfad + @ "\" zu verwenden, da es besser liest und ich denke, dass es die Formatierung von Ordnern / Dateinamen besser verzeiht. Nur persönliche Vorlieben. Diese Zeile lautet also: Dateiname = Path.Combine (Pfad, Dateiname + ".png");
Developer63
2

JAVA

Methode zum Erfassen eines Screenshots für die Fehler in Selen mit angehängtem Testname und Zeitstempel.

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
quelle
Wenn Sie diese (oder eine) Antwort hilfreich fanden, stimmen Sie sie bitte ab. Wenn dies Ihre Frage beantwortet hat, markieren Sie sie bitte als akzeptierte Antwort. Vielen Dank!
Anuj Teotia
1

C # (Ranorex API)

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