Jak zrobić zrzut ekranu za pomocą Selenium WebDriver

499

Czy ktoś wie, czy można zrobić zrzut ekranu za pomocą Selenium WebDriver? (Uwaga: Nie Selenium RC)

James Hollingworth
źródło
Prawdopodobnie jest tylko jeden sposób, aby to zrobić za pomocą protokołu WebDriver Wire, ale nikt nie używa tego protokołu bezpośrednio. Zamiast tego ludzie używają różnych powiązań / bibliotek języka, które zawijają protokół niskiego poziomu. Istnieje wiele powiązań językowych, więc musisz powiedzieć, którego chcesz użyć. W przeciwnym razie odpowiedzi jest zbyt wiele.
oberlies
Jakiego języka programowania używasz?
Ripon Al Wasim
Czy chcesz zrobić zrzut ekranu całej strony lub określonego elementu?
Ripon Al Wasim
Tak, możliwe jest zrobienie zrzutu ekranu całej strony lub określonego elementu za pomocą Selenium WebDriver
Ripon Al Wasim

Odpowiedzi:

506

Jawa

Tak to mozliwe. Poniższy przykład jest w Javie:

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
źródło
30
Skopiowanie pliku zamiast zmiany jego nazwy jest dobrym pomysłem, jeśli istnieje szansa, że ​​źródło i miejsce docelowe mogą nie znajdować się w tym samym systemie plików. Nie można zmienić nazwy między granicami systemu plików (przynajmniej na Uniksie). Zwróć uwagę, że często /tmpużywa się własnego systemu plików, a FirefoxDriver zapisuje zrzuty ekranu /tmp.
Tom Anderson,
9
Czy można to zrobić tylko w przypadku nieudanych spraw?
some_other_guy
6
Warto zauważyć, że HtmlUnitDriversię nie implementuje TakesScreenshot(patrz lista obsługiwanych sterowników - patrz selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ ...). Ale możesz zapisać jako HTML.
Wernight
7
Jaki pakiet jest wymagany do zaimportowania do używania klasy FileUtils?
Ripon Al Wasim,
7
@RiponAlWasim prawdopodobnieorg.apache.commons.io.FileUtils
Ben
269

Pyton

Każdy WebDriver ma .save_screenshot(filename)metodę. W przypadku Firefoksa można go użyć w następujący sposób:

from selenium import webdriver

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

Mylące jest .get_screenshot_as_file(filename)też, że istnieje metoda, która robi to samo.

Istnieją również metody: .get_screenshot_as_base64()(do osadzania w HTML) i .get_screenshot_as_png()(do pobierania danych binarnych).

i Zwróć uwagę, że WebElements ma .screenshot()metodę, która działa podobnie, ale przechwytuje tylko wybrany element.

Corey Goldberg
źródło
W przypadku innych przeglądarek wymień instancję webdriver. Jeśli chcesz tylko zrzuty ekranu swojej witryny, w tym stan, spójrz na Usersnap .
Gregor,
@ DavidRöthlisberger, to wszystko świetnie, ale twój komentarz nie ma nic wspólnego z moją odpowiedzią
Corey Goldberg
Aby zrobić zrzut całej strony, nie tylko widocznego obszaru, użyj mojego kodu python z mojej odpowiedzi tutaj do stich: stackoverflow.com/questions/37906704/…
Fabian Thommen
1
@CoreyGoldberg Prawda, nie ma nic wspólnego z twoją odpowiedzią. Ale mój stary skrypt używał starszego FF i zajął całą stronę, nie tylko okienko. Po zmianie na standardową teraz tylko rzutnia. Chciałem więc pomóc komuś, kto ma ten sam problem. I tak, stały element to prawdziwy ból w przewijaniu / zacinaniu!
Fabian Thommen
1
Jeszcze jedna rzecz, która ogromnie mi pomogła, jeśli potrzebujesz zmienić wymiar obrazu, po prostu ustaw rozmiar okna przed zrobieniem zdjęcia driver.set_window_size(1366, 728).
SpoiledBrat
110

DO#

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
źródło
9
Działa świetnie. Zastrzeżenie: wykonuje zrzut ekranu, a nie zrzut strony.
ljgww
masz na myśli, że dostaje pulpit i wszystko? A może masz na myśli, że ma tylko rzutnię?
vtortola
Otrzyma tylko to, co wchodzi w zakres sterownika, co pozwoli na przeprowadzenie wielu równoległych testów. Pamiętaj, że nie zostanie ono pomniejszone, jeśli fokus głównego okna twojego kierowcy ma pasek przewijania lub jeśli przekracza on jedną stronę.
Ben
3
aktualizacja do SaveAsFile (ścieżka ciągu, format ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran
1
To zadziałało dla mnie! Korzystałem z CopyFromScreen z przestrzeni nazw Graphics. Zaletą powyższego rozwiązania jest to, że działa, gdy kod jest wywoływany w sposób bezgłowy z TFS. Moja stara metoda CopyFromScreen działała tylko podczas uruchamiania testów selenu z Visual Studio, ale nigdy nie działała dla moich testów uruchamiania 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
źródło
3
Podobnie jak to opisuje Browserstack: browserstack.com/automate/node#enhancements-screenshots
Mike Causer
w data.replace co dokładnie robisz w nawiasach?
John Demetriou,
@JohnDemetriou, data to nazwa obiektu lub zmiennej, która zostanie utworzona podczas jej wywoływania. Możesz to nazwać, var1jeśli chcesz. Powinieneś spojrzeć na takeScreenshot()funkcję, aby wiedzieć, co to dokładnie jest. Może obraz binarny renderowany z javascript przy użyciu płótna. Może to być dom, zanim zostanie zrenderowany. Zbadać.
m3nda
66

Rubin

require 'rubygems'
require 'selenium-webdriver'

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

dostępnych jest więcej typów plików i opcji, które można zobaczyć na stronie takes_screenshot.rb

sirclesam
źródło
Działa dobrze dla mnie przy użyciu Selenium Grid 2. Skrypt i hub działający na OS X Snow Leopard; węzeł działający na RedHat EL 4 z Firefox 3.6.18 pod Xvfb.
MarkD,
1
Czy jest jakiś sposób na zrobienie zrzutu całego ekranu, a nie tylko widocznego obszaru?
Arihant Godha
2
Domyślnie pobierana jest cała strona. Przynajmniej używając headlessiFirefox
Ashley,
35

Jawa

Problem został rozwiązany. Możesz go rozszerzyć, RemoteWebDriveraby uzyskać wszystkie interfejsy implementowane przez jego proxy:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
użytkownik708910
źródło
Jeśli to zrobisz, to nie musisz kopiować zrzutów ekranu do nazwy pliku z ThreadId, abyś wiedział, które wątki / wystąpienia sterownika rzuciły zrzut ekranu? W przeciwnym razie wiele wystąpień przeglądarki w jednym węźle siatki nadpisuje nawzajem zrzuty ekranu?
djangofan,
1
Chciałbym podkreślić to, że tylko takie rozwiązanie pracował dla mnie za pomocą bezgłowe ChromeDriver
GabrielRado
34

PHP (PHPUnit)

Używa rozszerzenia PHPUnit_Selenium w wersji 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
źródło
daaaamn! Chcę wiedzieć więcej na ten temat, Selenium jest dla mnie nowością i szukam rozwiązania cli do tworzenia zrzutów ekranu w wielu przeglądarkach i systemach operacyjnych w celu przeprowadzenia testów wizualnych
pythonian29033
25

DO#

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
źródło
18

Jawa

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
źródło
jakiego sterownika użyłeś? nowy Augmenter (). augment (sterownik);
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"))
Świeży umysł
źródło
9

Java (Robot Framework)

Użyłem tej metody do robienia zrzutów ekranu.

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

Możesz użyć tej metody, gdziekolwiek jest to wymagane.

Ank
źródło
Skup się na przeglądarce przez cały czas, w przeciwnym razie zrobisz migawkę tego, co jest aktualnie skupione.
kushal.8
8

Jawa

Wydaje się, że tutaj brakuje - wykonanie zrzutu ekranu określonego elementu w Javie:

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.
źródło
Nie sądzę, aby to podejście mogło działać, ponieważ zrzut ekranu i przeglądarka mają różne rozdzielczości. Tak więc, korzystając z położenia współrzędnych uzyskanego przez selen na twoim obrazie, na pewno
zetkniesz
Próbowałeś kodu? Zadziałało, kiedy ostatni raz tego spróbowałem.
Erki M.,
1
Działa idealnie dobrze, dopóki próbujesz uchwycić element, który jest widoczny bez przewijania. Kiedy trzeba przewinąć do elementu, aby go uchwycić, wówczas przesunięcie y jest obliczane od góry strony, co następnie przekracza granice obrazu pełnoekranowego. Najłatwiejszym rozwiązaniem jest zwiększenie rozmiaru ekranu codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); lub usunąć wszelkie niepotrzebne elementy za pomocą css. Właściwym rozwiązaniem byłoby obliczenie przesunięcia y z przewijania.
Ichwardort
1
W Firefoxdziała dobrze, ponieważ upraw ekran element z pełnego obrazu w oparciu o wymiary. W Chromejeśli element jest dostępny w widoku części z obecnie przewijanie od tego widoku część obrazu ujmuje elementu grzywny. Jeśli chcemy zrobić zrzut ekranu po document.documentElement.clientHeightdwukrotnym przewinięciu klienta Wysokość, użyj, (location.y)-2*clientHeightaby uzyskać dokładny zrzut ekranu elementu. Dzięki za ten post, ponieważ pomaga mi ...
Yash,
6

DO#

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

Wymaga pakietów NuGet:

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

Testowane z .NETFramework v4.5.2

userlond
źródło
5

Jawa

Nie udało mi się uzyskać zaakceptowanej odpowiedzi do pracy, ale zgodnie z bieżącą dokumentacją WebDriver , następujące działało dla mnie dobrze z Javą 7 w 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
źródło
4

Rubin (Ogórek)

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
źródło
Jaki to język?
codygman
Wygląda na to, że jest rubinowy, nie używa żadnego konkretnego sterownika sieciowego
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
źródło
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
źródło
w bieżącej wersji facebook / webdriver metodą jest takeScreenshot () i nie jest konieczne, aby base64_encode () dane wyjściowe przed zapisaniem pliku.
bilard
1
Czy możesz dodać kod do swojego przykładu, który pokazuje, jak wywołać tę takescreenshotfunkcję? W szczególności skąd $eventpochodzi zmienna? Jestem kompletnym Selenem noob, więc odpowiedź na to pytanie, która nie zakłada wcześniejszej wiedzy na temat Selenu, byłaby bardzo mile widziana!
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)

Inne sterowniki ...

$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
źródło
Prawdopodobnie lepiej używać [OpenQA.Selenium.ScreenshotImageFormat]::Pngniż System.Drawingprzestrzeń nazw.
Adarsha
4

Python - zrzut ekranu elementu:

To dość stare pytanie i ma wiele odpowiedzi. Wydaje się jednak, że brakuje zrzutu ekranu określonego elementu sieci przy użyciu Pythona.

Lokalizacja

Element sieciowy ma własną pozycję na stronie i ogólnie jest mierzony w pikselach xiy i znany jako (x, y) współrzędne elementu. Obiekt lokalizacji zawiera dwie wartości.

  1. location ['x'] - zwraca współrzędną 'x' elementu
  2. lokalizacja [„y”] - zwraca współrzędną „y” elementu

rozmiar

Podobnie jak lokalizacja, każdy element WebElement ma szerokość i wysokość; Dostępny jako obiekt wielkości.

  1. size [„width”] - zwraca „szerokość” elementu
  2. size [„height”] - zwraca „wysokość” elementu

Za pomocą współrzędnych (x, y) oraz wartości szerokości i wysokości możemy wykadrować obraz i zapisać go w pliku.

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

Uwaga: Źródło : http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/

Arun211
źródło
Co jest ze średnikami?
Maikflow
3

Istnieje wiele metod „s i klient, aby zrobić zrzut ekranu za pomocą


Metody Java

Poniżej przedstawiono różne metody Java do zrobienia zrzutu ekranu :

  • Korzystanie getScreenshotAs()z interfejsu TakesScreenshot :

    • Blok kodu:

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

Mads_Cruz_screenshot

  • Jeśli strona internetowa jest jquery włączoną , możesz jej użyćz biblioteki pazone / ashot :

    • Blok kodu:

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

firefoxScreenshot.png

  • Za pomocą z biblioteki assertthat / selenium-shutterbug :

    • Blok kodu:

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

2019_03_12_16_30_35_787.png


Metody Pythona

Poniżej przedstawiono różne metody wykonywania zrzutów ekranu w języku Python :

  • Za pomocą save_screenshot()metody:

    • Blok kodu:

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

save_screenshot_method.png

  • Za pomocą get_screenshot_as_file()metody:

    • Blok kodu:

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

get_screenshot_as_file_method.png

  • Za pomocą get_screenshot_as_png()metody:

    • Blok kodu:

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

get_screenshot_as_png_method.png

DebanjanB
źródło
2

Pyton

Możesz przechwycić obraz z systemu Windows za pomocą sterownika sieciowego Python. Użyj kodu, poniżej którego strona ma przechwycić zrzut ekranu

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
Kv.senthilkumar
źródło
4
ta odpowiedź jest duplikatem opublikowanym kilka lat po oryginalnej odpowiedzi w języku Python.
Corey Goldberg,
3
również ta odpowiedź nie unika ukośników w nazwie ścieżki ... co spowoduje błąd
Corey Goldberg,
Brakuje również kodu instalacyjnego, ta linia sama w sobie nie będzie działać.
ograniczenie aktywności
2

Jawa

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

Korzystając z tych dwóch metod, możesz również zrobić zrzut ekranu z datą i godziną.

Raghuveer
źródło
2

Jawa

Używając RemoteWebDriver, po rozszerzeniu węzła o możliwość tworzenia zrzutów ekranu, zapisywałbym zrzut ekranu w następujący sposób:

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

Możesz użyć tej metody, gdziekolwiek jest to wymagane. Następnie zakładam, że możesz dostosować arkusz stylów wtyczki maven-surefire-report-plugin w surefire-raporty / html / custom.css, aby twoje raporty zawierały link do prawidłowego zrzutu ekranu dla każdego testu?

djangofan
źródło
W dzisiejszych czasach nie zrobiłbym tego w ten sposób. Prawdopodobnie użyłbym frameworku takiego jak Selenide.
djangofan
2

Jawa

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

Mam nadzieję, że to rozwiąże twój problem

Yerram Naveen
źródło
2

DO#

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
źródło
2

Selenese

captureEntirePageScreenshot | /path/to/filename.png | background=#ccffdd
Bernát
źródło
2

DO#

Aby zrobić zrzut ekranu z selenem, możesz użyć następującego fragmentu kodu / funkcji:

    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
źródło
„using System.Drawing.Imaging;” montaż.
ArNumb
Musiałem użyć tej linii w wywołaniu SaveAsFile: ss.SaveAsFile (nazwa pliku, ScreenshotImageFormat.Png); Ja też wolę używać Path.Combine (folder, nazwa pliku) na ścieżce + @ „\”, bo brzmi lepiej, i myślę, że może być bardziej wyrozumiały od formatting.variations folderu / pliku. Tylko osobiste preferencje. Tak więc ta linia staje się: nazwa_pliku = ścieżka.Combine (ścieżka, nazwa pliku + „.png”);
Developer63
2

JAWA

Metoda przechwytywania zrzutu ekranu dla awarii w Selenium z dołączoną nazwą testową i datownikiem.

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
źródło
Jeśli uważasz, że ta (lub jakakolwiek) odpowiedź była pomocna, proszę ją głosować. Jeśli odpowiedziałeś na twoje pytanie, zaznacz je jako zaakceptowaną odpowiedź. Dzięki!
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
źródło