Selenium WebDriver ile ekran görüntüsü nasıl alınır


499

Selenium WebDriver kullanarak ekran görüntüsü almanın mümkün olup olmadığını bilen var mı? (Not: Selenyum RC değil)


Muhtemelen bunu WebDriver Wire Protocol ile yapmanın tek bir yolu vardır, ancak hiç kimse bu protokolü doğrudan kullanmaz. Bunun yerine, insanlar düşük düzeyli protokolü saran farklı dil bağlamaları / kütüphaneleri kullanırlar. Bir sürü dil bağlaması var, bu yüzden hangisini kullanmak istediğinizi söylemelisiniz. Aksi takdirde, çok fazla cevap var.
oberlies

Hangi programlama dilini kullanıyorsunuz?
Ripon Al Wasim

Tüm sayfanın veya belirli bir öğenin ekran görüntüsünü almak istiyor musunuz?
Ripon Al Wasim

Evet, Selenium WebDriver
Ripon Al Wasim

Yanıtlar:


507

Java

Evet mümkün. Aşağıdaki örnek Java'dadır:

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
Dosyayı yeniden adlandırmak yerine kopyalamak, kaynak ve hedefin aynı dosya sisteminde bulunma ihtimali varsa iyi bir fikirdir. Dosya sistemi sınırları boyunca yeniden adlandıramazsınız (en azından unix'te). /tmpKendi dosya sisteminde olmanın yaygın olduğunu ve FirefoxDriver'ın ekran görüntülerini yazdığını unutmayın /tmp.
Tom Anderson

9
Bunu sadece başarısız vakalar için yapmanın bir yolu var mı?
some_other_guy

6
Uygulama HtmlUnitDriveryapmadığını belirtmek gerekir (desteklenen sürücülerin bir listesi için selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/…TakesScreenshot adresine bakın ). Ancak HTML olarak kaydedebilirsiniz.
Wernight

7
FileUtils sınıfını kullanmak için hangi paketin içe aktarılması gerekir?
Ripon Al Wasim

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

269

piton

Her WebDriver'ın bir .save_screenshot(filename)yöntemi vardır. Yani Firefox için şu şekilde kullanılabilir:

from selenium import webdriver

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

Kafa karıştırıcı bir şekilde .get_screenshot_as_file(filename), aynı şeyi yapan bir yöntem de vardır.

Ayrıca şu yöntemler de vardır: .get_screenshot_as_base64()(html içine gömmek için) ve .get_screenshot_as_png()(ikili verileri almak için).

ve WebElements öğesinin .screenshot()benzer şekilde çalışan ancak yalnızca seçilen öğeyi yakalayan bir yöntemi olduğunu unutmayın .


Diğer tarayıcılarda webdriver örneğini değiştirin. Sadece web sitenizin durum da dahil olmak üzere ekran görüntülerini istiyorsanız, Usersnap'a bir göz atın .
Gregor

@ DavidRöthlisberger hepsi harika, ama yorumunuzun cevabımla bir ilgisi yok
Corey Goldberg

Sadece görünür alanın değil, tam bir sayfanın ekran görüntüsünü yapmak için, buradaki cevabımdaki python kodumu kullanın: stackoverflow.com/questions/37906704/…
Fabian Thommen

1
@CoreyGoldberg Doğru, cevabınızla ilgisi yok. Ama eski betiğim daha eski bir FF kullandı ve sadece görüntü alanını değil, tüm sayfayı aldı. Standart olarak değiştirdikten sonra artık sadece görüntü alanı. Bu yüzden aynı sorunu yaşayan birine yardım etmek istedim. Ve evet, sabit eleman kaydırma / dikişte gerçek bir acıdır!
Fabian Thommen

1
Bana çok yardımcı olan bir şey daha var, eğer görüntü boyutunu değiştirmeniz gerekiyorsa, anlık görüntüyü kullanmadan önce pencere boyutunu ayarlayın 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
Mükemmel çalışıyor. Uyarı: sayfa görüntüsü değil ekran görüntüsü alır.
ljgww

yani masaüstünü ve her şeyi alır mı? Yoksa manzarayı aldığını mı söylüyorsun?
vtortola

Sadece sürücünün kapsamına girenleri alacaktır, bu çoklu paralel testlerin yapılmasına izin vermektir. Sürücünüzün ana pencere odağı bir kaydırma çubuğuna sahipse veya tek bir sayfayı aşarsa uzaklaştırma yapmayacağını unutmayın.
Ben

3
SaveAsFile (string path, ScreenshotImageFormat formatı) güncellemesi ScreenshotImageFormat.Jpeg
Kieran

1
Bu benim için çalıştı! Grafik ad alanından CopyFromScreen kullanıyordum. Yukarıdaki çözümün avantajı, kod TFS'den başsız bir şekilde çağrıldığında çalışmasıdır. Eski CopyFromScreen yöntemim yalnızca Visual Studio'dan selenyum testleri çalıştırırken çalıştı, ancak TFS çalıştırma testlerim için hiç çalışmadı.
Ewan

74

JavaScript (Selenyum-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
Browserstack'ın nasıl tarif ettiğine benzer: browserstack.com/automate/node#enhancements-screenshots
Mike Causer

data.replace içinde tam olarak parantez içinde ne yapıyorsunuz?
John Demetriou

@JohnDemetriou, veriler, aradığınızda oluşturulacak nesnenin veya değişkenin adıdır. var1İsterseniz U arayabilirsiniz . U takeScreenshot()tam olarak ne olduğunu bilmek fonksiyonuna bakmak gerekir . Belki tuval kullanarak javascript oluşturulan bir ikili görüntü. Oluşturulmadan önce dom olabilir. Bakın.
m3nda

66

Yakut

require 'rubygems'
require 'selenium-webdriver'

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

daha fazla dosya türü ve seçeneği mevcuttur ve bunları takes_screenshot.rb'de görebilirsiniz


Selenium Grid 2 kullanarak benim için iyi çalıştı. Senaryo ve OS X Snow Leopard üzerinde çalışan hub; Xvfb altında Firefox 3.6.18 ile RedHat EL 4 üzerinde çalışan düğüm.
MarkD

1
Yalnızca görünen alanı değil, tam sayfa ekran görüntüsünü almanın herhangi bir yolu var mı?
Arihant Godha

2
Tam sayfa varsayılan olarak alınır. En azından headlessveFirefox
Ashley

35

Java

Bu sorunu çözdüm. Sen çoğaltmak olabilir RemoteWebDriverarayüzleri kendi vekalet edilen sürücü uygular tüm vermek:

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

Bunu yaparsanız, sürücünüzün hangi iş parçacıklarını / örneklerini ekran görüntüsünü attığını anlayabilmeniz için ekran görüntülerini threadId ile bir dosya adına kopyalamanız gerekmez mi? Aksi takdirde, bir ızgara düğümündeki bir tarayıcının birden çok örneği birbirlerinin ekran görüntülerinin üzerine yazılır mı?
djangofan

1
Başsız ChromeDriver kullanarak sadece bu çözümün işe yaradığını belirtmek isterim
GabrielRado

34

PHP (PHPUnit)

PHPUnit_Selenium uzantısı sürüm 1.2.7'yi kullanır:

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! Bu konuda daha fazla bilmek istiyorum, Selenyum benim için yeni ve ben görsel testler yapmak tarayıcılar ve işletim sistemleri bir dizi boyunca oluşturarak ekran görüntüleri bir cli çözüm arıyorum
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

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

hangi sürücüyü kullandın yeni Augmenter (). büyütme (sürücü);
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 Çerçevesi)

Bu yöntemi ekran görüntüsü almak için kullandım.

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

Gerektiğinde bu yöntemi kullanabilirsiniz.


Odağınız her zaman tarayıcıda kalmalıdır, aksi takdirde o anda odaklanılanın anlık görüntüsü alınır.
kushal.8

8

Java

Burada eksik görünüyor - Java'da belirli bir öğenin ekran görüntüsünü almak :

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

Ekran görüntüsü ve gerçek tarayıcı farklı çözünürlüklere sahip olduğundan, bu yaklaşımın gerçekten işe yarayacağını sanmıyorum. Bu nedenle, görüntünüzde selenyum tarafından elde edilen koordinat konumunu kullanırken bir java.awt.image.RasterFormatException içine
gireceğinizden

Kodu denedin mi? En son denediğimde işe yaradı.
Erki M.

1
Kaydırma yapmadan görünen bir öğeyi yakalamaya çalıştığınız sürece mükemmel şekilde çalışır. Bir öğeyi yakalamak için kaydırmanız gerektiğinde, y ofseti sayfanın üstünden hesaplanır ve bu da tam ekran görüntünün sınırlarını aşar. Bu nedenle en kolay çözüm ya codebu.driver.manage (). Window (). Ekran boyutunu artırmaktır. SetSize (new Dimension (1680, 1050)); veya gerekli olmayan öğeleri css yoluyla kaldırmak için. Uygun çözüm y-ofsetini kaydırmadan hesaplamak olacaktır.
Ichwardort

1
Gelen Firefoxeserler cezası o Boyutları dayalı tam Görüntüden eleman ekranını kırpar olarak. Gelen Chromeelemanı olup görünüşüdür kısmı görüntüden kaydırma dışarı görünüşüdür bölümü içinde mevcut ise, bu eleman ince yakalar. document.documentElement.clientHeightİstemci Yüksekliğini iki kez kaydırdıktan sonra ekran görüntüsü almak istiyorsak, (location.y)-2*clientHeighttam eleman ekran görüntüsü almak için kullanın . Bana yardımcı olduğu için bu yazı için teşekkürler ...
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();
        }
    }
}

NuGetPackages gerektirir:

  1. PhantomJS 2.0.0
  2. Selenyum Destek 2.48.2
  3. Selenyum.WebDriver 2.48.2

.NETFramework v4.5.2 ile test edilmiştir


5

Java

Kabul edilen cevabı işe alamadım, ancak mevcut WebDriver belgelerine göre , OS X 10.9'da Java 7 ile aşağıdakiler benim için iyi çalıştı:

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

Yakut (Salatalık)

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

Bu hangi dil?
codygman

Bu, herhangi bir belirli web sürücüsü kullanmadan, yakut gibi görünüyor
James

4

Yakut

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

facebook / webdriver'ın geçerli sürümünde yöntem takeScreenshot () yöntemidir ve dosyayı kaydetmeden önce çıktıyı base64_encode () yöntemine gerek yoktur.
billrichards

1
Örneğinize bu takescreenshotişlevi nasıl arayacağınızı gösteren bir kod ekler misiniz ? Özellikle $eventdeğişken nereden geliyor? Ben tam bir Selenyum çaylakım, bu nedenle daha önce Selenyum bilgisinin çok takdir edileceğini varsaymayan bu soruya bir cevap!
Kenny83

4

Güç kalkanı

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)

Diğer sürücüler ...

$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

Muhtemelen daha iyi kullanmak için [OpenQA.Selenium.ScreenshotImageFormat]::Pngdaha System.Drawingad.
Adarsha

4

Python - Element Ekran Görüntüsü:

Bu oldukça eski bir soru ve birden fazla cevabı var. Ancak Python kullanarak belirli bir web öğesinin ekran görüntüsünü almak burada eksik.

yer

Bir web öğesinin sayfadaki kendi konumu vardır ve genellikle x ve y piksel olarak ölçülür ve öğenin (x, y) koordinatları olarak bilinir. Ve konum nesnesi iki değer içeriyor.

  1. konum ['x'] - öğenin 'x' koordinatını döndürür
  2. location ['y'] - öğenin 'y' koordinatını döndürür

boyut

Konum gibi, her WebElement'in genişliği ve yüksekliği vardır; Boyut nesnesi olarak kullanılabilir.

  1. size ['width'] - öğenin 'width' değerini döndürür
  2. size ['height'] - öğenin 'height' değerini döndürür

(X, y) koordinatları ve genişlik, yükseklik değerlerini kullanarak görüntüyü kırpabilir ve bir dosyada saklayabiliriz.

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

Not: Alındığı http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/


Noktalı virgüllerle ilgili nedir?
Maikflow

3

Birden çok yöntem var 'ler ve kullanarak ekran görüntüsü almak için müşteri


Java Yöntemleri

Ekran görüntüsü almak için farklı Java yöntemleri şunlardır :

  • Kullanılması getScreenshotAs()gelen TakesScreenshot Arayüzü:

    • Kod Bloğu:

      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();
          }
      }
      
    • Ekran görüntüsü:

Mads_Cruz_screenshot

  • Eğer web sayfası olan jquery kullanabileceğiniz etkindan pazone / ashot kütüphanesinde:

    • Kod Bloğu:

      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();
          }
      }
      
    • Ekran görüntüsü:

firefoxScreenshot.png

  • kullanma den / selen fotoğrafkurdu assertthat kütüphanesi:

    • Kod Bloğu:

      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();
          }
      }
      
    • Ekran görüntüsü:

2019_03_12_16_30_35_787.png


Python Yöntemleri

Ekran görüntüsü almak için farklı Python yöntemleri şunlardır :

  • save_screenshot()Yöntemi kullanarak :

    • Kod Bloğu:

      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()
      
    • Ekran görüntüsü:

save_screenshot_method.png

  • get_screenshot_as_file()Yöntemi kullanarak :

    • Kod Bloğu:

      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()
      
    • Ekran görüntüsü:

get_screenshot_as_file_method.png

  • get_screenshot_as_png()Yöntemi kullanarak :

    • Kod Bloğu:

      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()
      
    • Ekran görüntüsü:

get_screenshot_as_png_method.png


2

piton

Python web sürücüsünü kullanarak pencerelerden görüntü yakalayabilirsiniz. Ekran görüntüsünü yakalamak için hangi sayfanın gerekli olduğu kodu kullanın

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

4
bu cevap, orijinal Python cevabından birkaç yıl sonra gönderilen bir kopyadır.
Corey Goldberg

3
Ayrıca, bu cevap yol adında ters eğik çizgiler kaçmaz .. bir hataya neden olur
Corey Goldberg

Ayrıca, kurulum kodu eksik, bu satır tek başına çalışmaz.
aktiviteyi azaltma

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

Bu iki yöntemi kullanarak tarih ve saatle birlikte ekran görüntüsü de alabilirsiniz.


2

Java

RemoteWebDriver'ı kullanarak, Düğümü ekran görüntüsü yeteneği ile büyüttükten sonra, ekran görüntüsünü şu şekilde depolarım:

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

Gerektiğinde bu yöntemi kullanabilirsiniz. Daha sonra, maven-surefire-report-plugin'in stil sayfasını surefire-report / html / custom.css dosyasında özelleştirebildiğinizi ve raporlarınızın her test için doğru ekran görüntüsüne bağlantı içerdiğini varsayalım?


Bugünlerde böyle yapmam. Muhtemelen Selenide gibi bir çerçeve kullanırdım.
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));

Umarız bu sorununuzu çözer


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 #

Selenyum ile ekran görüntüsü almak için aşağıdaki kod snippet / işlevini kullanabilirsiniz:

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

"System.Drawing.Imaging kullanarak;" montaj.
ArNumb

SaveAsFile çağrısında bu satırı kullanmak zorunda kaldı: ss.SaveAsFile (dosya adı, ScreenshotImageFormat.Png); Ayrıca daha iyi okuduğu için + @ "\" yolu üzerinde Path.Combine (klasör, dosya adı) kullanmayı tercih ediyorum ve klasör / dosya adı biçimlendirme.variations için daha affedici olabileceğini düşünüyorum . Yalnızca kişisel tercih. Böylece bu satır şöyle olur: filename = Path.Combine (yol, dosyaadı + ".png");
Developer63


2

JAVA

TestName ve Zaman Damgası eklenmiş Selenium'daki hatalar için Ekran Görüntüsü Alma Yöntemi.

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

Bu cevabı (veya herhangi birini) faydalı bulduysanız lütfen oy verin. Bu, sorunuzu cevapladıysa, lütfen kabul edilen cevap olarak işaretleyin. Teşekkürler!
Anuj Teotia

1

C # (Ranorex API'sı)

public static void ClickButton()
{
    try
    {
        // code
    }
    catch (Exception e)
    {
        TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
        Report.Screenshot();
        throw (e);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.