Cara mengambil tangkapan layar dengan Selenium WebDriver


498

Adakah yang tahu apakah mungkin untuk mengambil tangkapan layar menggunakan Selenium WebDriver? (Catatan: Bukan Selenium RC)


Mungkin hanya ada satu cara untuk melakukan ini dengan WebDriver Wire Protocol, tetapi tidak ada yang menggunakan protokol ini secara langsung. Sebagai gantinya, orang-orang menggunakan binding / perpustakaan bahasa yang berbeda yang membungkus protokol tingkat rendah. Ada banyak ikatan bahasa, jadi Anda harus mengatakan yang mana yang ingin Anda gunakan. Kalau tidak, ada terlalu banyak jawaban.
Oberlies

Bahasa pemrograman mana yang Anda gunakan?
Ripon Al Wasim

Apakah Anda ingin mengambil tangkapan layar seluruh halaman atau elemen tertentu?
Ripon Al Wasim

Ya, dimungkinkan untuk mengambil tangkapan layar baik seluruh halaman atau untuk elemen tertentu dengan Selenium WebDriver
Ripon Al Wasim

Jawaban:


506

Jawa

Ya itu mungkin. Contoh berikut di Jawa:

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
Menyalin file, daripada mengganti nama file, adalah ide yang bagus jika ada kemungkinan bahwa sumber dan tujuan mungkin tidak berada pada sistem file yang sama. Anda tidak dapat mengganti nama melintasi batas sistem file (setidaknya di unix). Perhatikan bahwa biasanya /tmpmenggunakan sistem file sendiri, dan FirefoxDriver menulis tangkapan layar /tmp.
Tom Anderson

9
Apakah ada cara untuk melakukannya hanya untuk kasus yang gagal?
some_other_guy

6
Perlu dicatat bahwa HtmlUnitDrivertidak menerapkan TakesScreenshot(lihat selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/... untuk daftar driver yang didukung). Tetapi Anda dapat menyimpan sebagai HTML.
Wernight

7
Paket apa yang diperlukan untuk mengimpor karena menggunakan kelas FileUtils?
Ripon Al Wasim

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

270

Python

Setiap WebDriver memiliki .save_screenshot(filename)metode. Jadi untuk Firefox, bisa digunakan seperti ini:

from selenium import webdriver

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

Yang membingungkan, ada .get_screenshot_as_file(filename)metode yang juga melakukan hal yang sama.

Ada juga metode untuk: .get_screenshot_as_base64()(untuk menanamkan dalam html) dan .get_screenshot_as_png()(untuk mengambil data biner).

dan Perhatikan bahwa WebElements memiliki .screenshot()metode yang berfungsi serupa, tetapi hanya menangkap elemen yang dipilih.


Untuk browser lain, tukarkan instance webdriver. Jika Anda hanya ingin tangkapan layar situs web Anda termasuk keadaan, lihat Usersnap .
Gregor

@ DavidRöthlisberger itu bagus sekali, tetapi komentar Anda tidak ada hubungannya dengan jawaban saya
Corey Goldberg

Untuk membuat scrennshot dari halaman penuh, tidak hanya area yang terlihat, gunakan kode python saya dari jawaban saya di sini untuk stich: stackoverflow.com/questions/37906704/…
Fabian Thommen

1
@CoreyGoldberg Benar, tidak ada hubungannya dengan jawaban Anda. Tapi skrip lama saya menggunakan FF yang lebih lama dan itu mengambil seluruh halaman, tidak hanya viewport. Setelah mereka mengubahnya ke standar sekarang hanya viewport. Jadi saya ingin membantu seseorang yang memiliki masalah yang sama. Dan ya, elemen tetap benar-benar menyakitkan di scroll / stich!
Fabian Thommen

1
Satu hal lagi yang sangat membantu saya, jika Anda perlu mengubah dimensi gambar, cukup atur ukuran jendela sebelum Anda mengambil foto menggunakan driver.set_window_size(1366, 728).
SpoiltBrat

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
Bekerja dengan sempurna. Peringatan: mengambil tangkapan layar, bukan tangkapan halaman.
ljgww

Apakah maksud Anda desktop dan segalanya? Atau maksud Anda hanya mendapatkan viewport?
vtortola

Ini hanya akan mendapatkan apa yang ada dalam ruang lingkup pengemudi, ini untuk memungkinkan beberapa tes paralel terjadi. Perhatikan bahwa itu tidak akan memperkecil jika fokus utama jendela driver Anda memiliki bilah gulir atau jika melebihi satu halaman.
Ben

3
perbarui ke SaveAsFile (jalur string, format ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran

1
Ini berhasil untuk saya! Saya menggunakan CopyFromScreen dari namespace Graphics. Keuntungan dari solusi di atas adalah ia bekerja ketika kode dipanggil tanpa kepala dari TFS. Metode CopyFromScreen lama saya hanya berfungsi ketika menjalankan tes selenium dari Visual Studio tetapi tidak pernah bekerja untuk tes menjalankan TFS saya.
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
Mirip dengan bagaimana Browserstack menggambarkannya: browserstack.com/automate/node#enhancements-screenshots
Mike Causer

dalam data. ganti apa yang sebenarnya Anda lakukan dalam tanda kurung?
John Demetriou

@JohnDemetriou, data adalah nama objek atau variabel yang akan dibuat saat Anda memanggilnya. Anda dapat memanggilnya var1jika Anda mau. Anda harus melihat takeScreenshot()fungsinya untuk mengetahui apa sebenarnya itu. Mungkin gambar biner yang dihasilkan dari javascript menggunakan kanvas. Ini bisa menjadi dom, sebelum diberikan. Memeriksa.
m3nda

66

Rubi

require 'rubygems'
require 'selenium-webdriver'

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

lebih banyak jenis dan opsi file tersedia dan Anda dapat melihatnya di takes_screenshot.rb


Bekerja dengan baik untuk saya menggunakan Selenium Grid 2. Script dan hub berjalan pada OS X Snow Leopard; simpul berjalan di RedHat EL 4 dengan Firefox 3.6.18 di bawah Xvfb.
MarkD

1
Apakah ada cara untuk mengambil tangkapan layar halaman penuh, bukan hanya area yang terlihat?
Arihant Godha

2
Halaman penuh diambil secara default. Setidaknya menggunakan headlessdanFirefox
Ashley

35

Jawa

Saya mengatasi masalah ini. Anda dapat menambahkannya RemoteWebDriveruntuk memberikan semua antarmuka yang diimplementasikan oleh driver proksi:

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

Jika Anda melakukannya, maka bukankah Anda perlu menyalin tangkapan layar ke nama file dengan threadId sehingga Anda dapat mengetahui utas / instance dari driver Anda yang melemparkan tangkapan layar? Jika tidak, beberapa contoh browser pada satu node grid akan menimpa tangkapan layar satu sama lain?
djangofan

1
Saya ingin menunjukkan bahwa hanya solusi ini yang bekerja untuk saya menggunakan ChromeDriver tanpa kepala
GabrielRado

34

PHP (PHPUnit)

Menggunakan ekstensi PHPUnit_Selenium versi 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! Saya ingin tahu lebih banyak tentang ini, Selenium baru bagi saya dan saya sedang mencari solusi cli untuk membuat tangkapan layar di sejumlah browser dan OS untuk melakukan tes visual
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

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

driver apa yang kamu gunakan? Augmenter baru (). 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 (Kerangka Robot)

Saya menggunakan metode ini untuk mengambil screenshot.

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

Anda dapat menggunakan metode ini di mana pun diperlukan.


Fokus Anda harus tetap di browser sepanjang waktu, jika tidak mengambil snapshot dari apa pun yang saat ini fokus.
kushal.8

8

Jawa

Tampaknya tidak ada di sini - mengambil tangkapan layar elemen tertentu di Jawa:

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

Saya tidak berpikir pendekatan ini dapat bekerja, karena tangkapan layar dan browser yang sebenarnya memiliki resolusi yang berbeda. Jadi ketika menggunakan lokasi koordinat yang diperoleh selenium pada gambar Anda, Anda cukup yakin untuk mengalami java.awt.image.RasterFormatException: (tinggi + y) berada di luar Raster
Ichwardort

Apakah Anda mencoba kodenya? Ini bekerja ketika saya terakhir mencobanya.
Erki M.

1
Ini berfungsi dengan baik selama Anda mencoba menangkap elemen yang terlihat tanpa menggulir. Saat Anda perlu menggulir ke elemen untuk mengambilnya, maka offset y dihitung dari bagian atas halaman, yang kemudian melampaui batas-batas gambar layar penuh. Jadi solusi termudah adalah dengan meningkatkan ukuran layar codethis.driver.manage (). Window (). SetSize (Dimensi baru (1680, 1050)); atau untuk menghapus elemen yang tidak diperlukan melalui css. Solusi yang tepat adalah menghitung offset-y dari pengguliran.
Ichwardort

1
Dalam Firefoxberfungsi dengan baik saat memotong layar elemen dari Gambar penuh berdasarkan Dimensi. Dalam Chromejika elemen tersedia dalam pandangan sebagian dengan keluar bergulir dari pandangan sebagian gambar menangkap elemen baik. Jika kita ingin mengambil tangkapan layar setelah menggulir document.documentElement.clientHeightklien sebanyak dua kali Tinggi gunakan (location.y)-2*clientHeightuntuk mendapatkan tangkapan layar elemen yang tepat. Terima kasih atas pos ini karena ini membantu saya ...
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();
        }
    }
}

Membutuhkan NuGetPackages:

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

Diuji dengan .NETFramework v4.5.2


5

Jawa

Saya tidak bisa mendapatkan jawaban yang diterima untuk bekerja, tetapi sesuai dengan dokumentasi WebDriver saat ini , berikut ini berfungsi dengan baik untuk saya dengan Java 7 pada 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);
   }
}

4

Ruby (Mentimun)

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

Bahasa apa ini?
codygman

Ini seperti di ruby, tidak menggunakan driver web spesifik apa pun
James

4

Rubi

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

dalam versi facebook / webdriver saat ini, metode ini adalah takeScreenshot () dan tidak perlu menggunakan base64_encode () output sebelum menyimpan file.
billrichards

1
Bisakah Anda menambahkan kode ke contoh Anda yang menunjukkan cara memanggil takescreenshotfungsi ini ? Secara khusus dari mana $eventvariabel berasal? Saya seorang Selenium noob yang lengkap sehingga jawaban untuk pertanyaan ini yang tidak mengasumsikan pengetahuan Selenium sebelumnya akan sangat dihargai!
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)

Pengemudi lain ...

$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

Mungkin lebih baik digunakan [OpenQA.Selenium.ScreenshotImageFormat]::Pngdaripada System.Drawingnamespace.
Adarsha

4

Python - Screenshot of Element:

Ini adalah pertanyaan yang cukup lama dan memiliki banyak jawaban. Namun sepertinya mengambil tangkapan layar dari elemen web tertentu menggunakan Python tidak ada di sini.

lokasi

Elemen web memiliki posisinya sendiri di halaman dan umumnya diukur dalam piksel x dan y dan dikenal sebagai koordinat (x, y) elemen. Dan objek lokasi berisi dua nilai.

  1. location ['x'] - mengembalikan koordinat 'x' elemen
  2. location ['y'] - mengembalikan koordinat 'y' dari elemen

ukuran

Seperti lokasi, setiap WebElement memiliki lebar dan tinggi; Tersedia sebagai objek ukuran.

  1. size ['width'] - mengembalikan 'width' elemen
  2. size ['height'] - mengembalikan 'tinggi' elemen

Dengan menggunakan (x, y) koordinat dan lebar, nilai tinggi kita dapat memotong gambar dan menyimpannya dalam 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')

Catatan: Diambil dari http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/


Ada apa dengan titik koma?
Maikflow

3

Ada beberapa metode ini dan klien untuk mengambil tangkapan layar menggunakan


Metode Jawa

Berikut adalah berbagai metode Java untuk mengambil tangkapan layar :

  • Menggunakan getScreenshotAs()dari TakesScreenshot Interface:

    • Blok Kode:

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

Mads_Cruz_screenshot

  • Jika halaman web adalah jquery diaktifkan Anda dapat menggunakandari pazone / ashot library:

    • Blok Kode:

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

firefoxScreenshot.png

  • Menggunakan dari perpustakaan assertthat / selenium-shutterbug :

    • Blok Kode:

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

2019_03_12_16_30_35_787.png


Metode Python

Berikut adalah berbagai metode Python untuk mengambil tangkapan layar :

  • Menggunakan save_screenshot()metode:

    • Blok Kode:

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

save_screenshot_method.png

  • Menggunakan get_screenshot_as_file()metode:

    • Blok Kode:

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

get_screenshot_as_file_method.png

  • Menggunakan get_screenshot_as_png()metode:

    • Blok Kode:

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

get_screenshot_as_png_method.png


2

Python

Anda dapat mengambil gambar dari windows menggunakan driver web python. Gunakan kode di bawah ini halaman mana yang perlu menangkap tangkapan layar

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

4
jawaban ini adalah duplikat yang diposting beberapa tahun setelah jawaban Python asli.
Corey Goldberg

3
juga, jawaban ini tidak lepas dari garis miring terbalik dalam nama jalur .. yang akan menyebabkan kesalahan
Corey Goldberg

Juga, kode pengaturan tidak ada, baris ini dengan sendirinya tidak akan berfungsi.
Mengurangi aktivitas

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

Dengan menggunakan dua metode ini, Anda dapat mengambil screenshot dengan tanggal dan waktu juga.


2

Jawa

Menggunakan RemoteWebDriver, setelah menambah Node dengan kemampuan tangkapan layar, saya akan menyimpan tangkapan layar seperti:

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

Anda dapat menggunakan metode ini di mana pun diperlukan. Lalu, saya berasumsi Anda dapat menyesuaikan style sheet dari maven-surefire-report-plugin di surefire-reports / html / custom.css sehingga laporan Anda menyertakan tautan ke tangkapan layar yang benar untuk setiap pengujian?


Saat ini saya tidak akan melakukannya dengan cara ini. Saya akan menggunakan kerangka kerja seperti Selenide mungkin.
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));

Semoga ini bisa menyelesaikan masalah Anda


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

Selen

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

2

C #

Anda dapat menggunakan potongan / fungsi kode berikut untuk mengambil tangkapan layar dengan selenium:

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

"menggunakan System.Drawing.Imaging;" majelis.
ArNumb

Saya harus menggunakan baris ini dalam panggilan SaveAsFile: ss.SaveAsFile (nama file, ScreenshotImageFormat.Png); Saya juga lebih suka menggunakan Path.Combine (folder, nama file) di atas path + @ "\" karena lebih baik, dan saya pikir mungkin lebih memaafkan folder / nama file format.variations. Preferensi pribadi saja. Jadi baris itu menjadi: nama file = Path.Combine (path, nama file + ".png");
Developer63


2

JAWA

Metode untuk Mengambil Tangkapan Layar untuk kegagalan di Selenium dengan TestName dan Timestamp ditambahkan.

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

Jika Anda menemukan jawaban ini (atau ada) membantu, silakan perbaiki. Jika ini menjawab pertanyaan Anda, harap tandai sebagai jawaban yang diterima. Terima kasih!
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);
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.