Selenium WebDriver로 스크린 샷을 찍는 방법


499

Selenium WebDriver를 사용하여 스크린 샷을 찍을 수 있는지 아는 사람이 있습니까? (참고 : 셀레늄 RC가 아님)


WebDriver Wire Protocol을 사용하여이 작업을 수행하는 방법은 한 가지 뿐이지 만이 프로토콜을 직접 사용하는 사람은 없습니다. 대신 사람들은 저수준 프로토콜을 감싸는 다른 언어 바인딩 / 라이브러리를 사용합니다. 많은 언어 바인딩이 있으므로 사용할 언어를 말해야합니다. 그렇지 않으면 너무 많은 답변이 있습니다.
— 준수

어떤 프로그래밍 언어를 사용하고 있습니까?
— Ripon Al Wasim

전체 페이지 또는 특정 요소의 스크린 샷을 찍으시겠습니까?
— Ripon Al Wasim

네, 화면 전체 페이지 중 하나를 취하거나 셀레늄 WebDriver와 특정 요소에 대해 할 수 있습니다
— 리폰 알 Wasim

답변:


507

자바

네 가능합니다. 다음 예제는 Java로되어 있습니다.

WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy somewhere
FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));

30
파일 이름을 바꾸는 대신 파일을 복사하는 것이 소스와 대상이 동일한 파일 시스템에 없을 가능성이있는 경우에 좋습니다. 파일 시스템 경계를 넘어서는 이름을 바꿀 수 없습니다 (적어도 유닉스에서는). /tmp자체 파일 시스템에있는 것이 일반적 이며 FirefoxDriver는에 스크린 샷을 작성합니다 /tmp.
— Tom Anderson

9
실패한 경우에만 수행 할 수있는 방법이 있습니까?
— some_other_guy

6
HtmlUnitDriver구현되지 않은 점은 주목할 가치가 있습니다 TakesScreenshot( 지원되는 드라이버 목록 은 selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… 참조 ). 그러나 HTML로 저장할 수 있습니다.
— Wernight

7
FileUtils 클래스를 사용하려면 어떤 패키지가 필요합니까?
— Ripon Al Wasim

7
@RiponAlWasim 아마org.apache.commons.io.FileUtils
— Ben

269

파이썬

각 WebDriver에는 .save_screenshot(filename)메소드가 있습니다. 따라서 Firefox의 경우 다음과 같이 사용할 수 있습니다.

from selenium import webdriver

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

혼란스럽게도 .get_screenshot_as_file(filename)같은 일을 하는 방법도 있습니다.

.get_screenshot_as_base64()(html로 임베드) 및 .get_screenshot_as_png()(이진 데이터 검색 ) 메소드도 있습니다 .

WebElement에는 .screenshot()유사하게 작동하지만 선택한 요소 만 캡처 하는 메소드가 있습니다.


다른 브라우저의 경우 웹 드라이버 인스턴스를 교환하십시오. 상태를 포함하여 웹 사이트의 스크린 샷을 원한다면 Usersnap을 살펴보십시오 .
— Gregor

DavidRöthlisberger은 모두 훌륭한 이잖아,하지만 당신의 코멘트를 내 대답과는 아무 상관이없는 @
— 코리 골드버그

전체 페이지의 scrennshot뿐만 아니라 가시 영역을 만들려면, 스티치 여기 내 대답에서 내 파이썬 코드를 사용 stackoverflow.com/questions/37906704/...
— 파비안 톰넨

1
@CoreyGoldberg 사실, 귀하의 답변과 관련이 없습니다. 그러나 이전 스크립트는 이전 FF를 사용했으며 뷰포트뿐만 아니라 전체 페이지를 차지했습니다. 표준으로 변경 한 후에는 뷰포트 만 있습니다. 그래서 나는 같은 문제를 겪고있는 누군가를 돕고 싶었습니다. 그리고 그렇습니다. 고정 요소는 스크롤 / 스틱에서 정말 고통 스럽습니다!
— Fabian Thommen

1
이미지 치수를 변경해야하는 경우을 사용하여 스냅 샷을 찍기 전에 창 크기를 설정하면됩니다 driver.set_window_size(1366, 728).
— SpoiledBrat

110

씨#

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
완벽하게 작동합니다. 주의 사항 : 페이지 샷이 아닌 스크린 샷을 찍습니다.
— ljgww

데스크탑과 모든 것을 얻는다는 의미입니까? 아니면 그냥 뷰포트를 얻는다는 의미입니까?
— vtortola

드라이버의 범위에있는 것만 가져옵니다. 이는 여러 병렬 테스트가 수행되도록하기위한 것입니다. 드라이버의 주 창 포커스에 스크롤 막대가 있거나 한 페이지를 초과하면 축소되지 않습니다.
— Ben

3
SaveAsFile (문자열 경로, ScreenshotImageFormat 형식)로 업데이트 ScreenshotImageFormat.Jpeg
— Kieran

1
이것은 나를 위해 일했다! 그래픽 네임 스페이스에서 CopyFromScreen을 사용하고있었습니다. 위의 솔루션의 장점은 코드가 TFS에서 헤드리스 방식으로 호출 될 때 작동한다는 것입니다. 이전 CopyFromScreen 메서드는 Visual Studio에서 셀레늄 테스트를 실행할 때만 작동했지만 TFS 실행 테스트에서는 작동하지 않았습니다.
— Ewan

74

자바 스크립트 (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
Browserstack에서 설명하는 방식과 유사합니다 : browserstack.com/automate/node#enhancements-screenshots
— Mike Causer

괄호 안에 정확히 무엇을하고 있습니까?
— John Demetriou

@JohnDemetriou, data는 호출 할 때 생성 될 객체 또는 변수의 이름입니다. var1원한다면 U가 전화 할 수 있습니다. U는 takeScreenshot()정확히 무엇인지 알기 위해 함수를 살펴 봐야 합니다. 캔버스를 사용하여 자바 스크립트에서 렌더링 된 이진 이미지 일 수 있습니다. 렌더링되기 전에 돔일 수 있습니다. 들여다보다.
— m3nda 2016 년

66

루비

require 'rubygems'
require 'selenium-webdriver'

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

더 많은 파일 유형과 옵션을 사용할 수 있으며 takes_screenshot.rb에서 볼 수 있습니다


Selenium Grid 2를 사용하여 잘 작동했습니다. OS X Snow Leopard에서 실행되는 스크립트 및 허브; Xvfb에서 Firefox 3.6.18이 설치된 RedHat EL 4에서 실행되는 노드.
— MarkD December

1
보이는 영역뿐만 아니라 전체 페이지 스크린 샷을 찍을 수있는 방법이 있습니까?
— Arihant Godha

2
전체 페이지가 기본적으로 사용됩니다. 적어도이 사용 headless하고Firefox
— 애슐리

35

자바

이 문제가 해결되었습니다. RemoteWebDriver프록시 드라이버가 구현하는 모든 인터페이스를 제공 하도록를 보강 할 수 있습니다 .

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

그렇게하면 threadId로 스크린 샷을 파일 이름으로 복사 할 필요가 없으므로 드라이버의 스레드 / 인스턴스가 스크린 샷을 던진 것을 알 수 있습니까? 그렇지 않으면 하나의 그리드 노드에있는 여러 브라우저 인스턴스가 서로의 스크린 샷을 덮어 쓰겠습니까?
— djangofan

1
나는 머리가없는 ChromeDriver를 사용하여 내게 만이 솔루션이 작동하는지 그것을 지적하고 싶습니다
— GabrielRado

34

PHP (PHPUnit)

PHPUnit_Selenium 확장 버전 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');
    }
    ...
}

대박! 나는 이것에 대해 더 알고 싶어합니다. Selenium은 나에게 새로운 것이며 시각적 테스트를 수행하기 위해 여러 브라우저와 OS에서 스크린 샷을 만드는 cli 솔루션을 찾고 있습니다
— pythonian29033

25

씨#

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

자바

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

어떤 드라이버를 사용하셨습니까? 새로운 Augmenter (). augment (driver);
— kozla13

12

자이 썬

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

자바 (로봇 프레임 워크)

이 방법을 사용하여 스크린 샷을 찍었습니다.

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

필요한 경우이 방법을 사용할 수 있습니다.


초점은 항상 브라우저에 남아 있어야하며, 그렇지 않으면 현재 초점이 맞춰진 항목의 스냅 샷을 찍습니다.
— kushal.

8

자바

Java에서 특정 요소의 스크린 샷을 찍어 여기에 누락 된 것 같습니다 .

public void takeScreenshotElement(WebElement element) throws IOException {
    WrapsDriver wrapsDriver = (WrapsDriver) element;
    File screenshot = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);
    Rectangle rectangle = new Rectangle(element.getSize().width, element.getSize().height);
    Point location = element.getLocation();
    BufferedImage bufferedImage = ImageIO.read(screenshot);
    BufferedImage destImage = bufferedImage.getSubimage(location.x, location.y, rectangle.width, rectangle.height);
    ImageIO.write(destImage, "png", screenshot);
    File file = new File("//path//to");
    FileUtils.copyFile(screenshot, file);
}

스크린 샷과 실제 브라우저의 해상도가 다르기 때문에이 방법이 실제로 효과가 있다고 생각하지 않습니다. 당신이 java.awt.image.RasterFormatException으로 실행하는 데 꽤 확신 이미지에 셀레늄에 의해 획득 된 좌표 위치를 사용하는 경우 그래서 (Y + 높이) 래스터의 외부이다
— Ichwardort

코드를 사용해 보셨습니까? 내가 마지막으로 시도했을 때 효과가있었습니다.
— Erki M.

1
스크롤하지 않고 보이는 요소를 캡처하려고 시도하면 완벽하게 작동합니다. 요소를 캡처하기 위해 스크롤해야하는 경우 페이지 상단에서 y 오프셋이 계산되어 전체 화면 이미지의 경계를 초과합니다. 따라서 가장 쉬운 해결책은 화면 크기를 code늘리는 것입니다. this.driver.manage (). window (). setSize (new Dimension (1680, 1050)); 또는 CSS를 통해 필요하지 않은 요소를 제거하십시오. 올바른 해결책은 스크롤에서 y 오프셋을 계산하는 것입니다.
— Ichwardort

1
에서 Firefox작품 벌금은 크기에 따라 전체 이미지의 요소 화면 작물로. 에서는 Chrome요소가 뷰의 부분 화상으로부터 밖으로 스크롤 뷰 부에서 사용할 경우에는 미세 소자를 캡처한다. document.documentElement.clientHeight클라이언트 높이의 두 번 스크롤 한 후 스크린 샷 (location.y)-2*clientHeight을 만들려면 정확한 요소 스크린 샷을 얻는 데 사용하십시오 . 도움이
— 되었으므로이

6

씨#

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

NuGetPackage가 필요합니다.

  1. PhantomJS 2.0.0
  2. Selenium. 지원 2.48.2
  3. Selenium.WebDriver 2.48.2

.NETFramework v4.5.2로 테스트


5

자바

받아 들일만한 대답을 얻을 수는 없었지만 현재 WebDriver 문서 에 따라 OS X 10.9의 Java 7에서 다음 이 제대로 작동 했습니다.

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

루비 (오이)

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

이것이 무슨 언어 지?
— codygman

특정 웹 드라이버를 사용하지 않고 루비처럼 보입니다
— James

4

루비

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

페이스 북 / 웹 드라이버의 현재 버전에서 메소드는 takeScreenshot ()이며 파일을 저장하기 전에 출력을 base64_encode () 할 필요는 없습니다.
— billrichards

1
이 takescreenshot함수 를 호출하는 방법을 보여주는 코드를 예제에 추가해 주 시겠습니까? 특히 $event변수는 어디에서 왔습니까? 나는 완전한 Selenium 멍청한 놈이므로 이전 Selenium 지식을 가정하지 않는이 질문에 대한 답변은 대단히 감사하겠습니다!
— 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)

다른 드라이버 ...

$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

네임 스페이스 [OpenQA.Selenium.ScreenshotImageFormat]::Png보다 사용하는 것이 좋습니다 System.Drawing.
— Adarsha

4

Python-요소 스크린 샷 :

이것은 꽤 오래된 질문이며 여러 답변이 있습니다. 그러나 파이썬을 사용하여 특정 웹 요소의 스크린 샷을 찍는 것이 누락 된 것 같습니다.

위치

웹 요소는 페이지에서 자체 위치를 가지며 일반적으로 x 및 y 픽셀 단위로 측정되며 요소의 (x, y) 좌표로 알려져 있습니다. 그리고 location 객체는 두 개의 값을 포함합니다.

  1. location [ 'x']-요소의 'x'좌표를 반환
  2. location [ 'y']-요소의 'y'좌표를 반환

크기

위치와 마찬가지로 각 WebElement에는 너비와 높이가 있습니다. 크기 객체로 사용 가능합니다.

  1. size [ 'width']-요소의 'width'를 반환합니다
  2. size [ 'height']-요소의 '높이'를 반환

(x, y) 좌표와 너비, 높이 값을 사용하여 이미지를 자르고 파일에 저장할 수 있습니다.

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

참고 : http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/ 에서 가져옵니다.


세미콜론은 무엇입니까?
— Maikflow

3

통해 여러 가지 방법이 있습니다 '에스 과 클라이언트는 걸릴 스크린 샷을 사용하여


자바 메소드

다음은 스크린 샷 을 찍는 다양한 Java 메소드입니다 .

  • TakesScreenshot 인터페이스 getScreenshotAs()에서 사용 :

    • 코드 블록 :

      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();
          }
      }
      
    • 스크린 샷 :

Mads_Cruz_screenshot

  • 웹 페이지 가 jquery를 사용하도록 설정된 경우 사용할 수 있습니다에서 pazone / ashot의 라이브러리 :

    • 코드 블록 :

      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();
          }
      }
      
    • 스크린 샷 :

firefoxScreenshot.png

  • 사용 에서 / 셀레늄 사진 광에 assertthat 라이브러리 :

    • 코드 블록 :

      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();
          }
      }
      
    • 스크린 샷 :

2019_03_12_16_30_35_787.png


파이썬 메소드

다음은 스크린 샷 을 찍는 다른 Python 메소드입니다 .

  • save_screenshot()방법을 사용하여 :

    • 코드 블록 :

      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()
      
    • 스크린 샷 :

save_screenshot_method.png

  • get_screenshot_as_file()방법을 사용하여 :

    • 코드 블록 :

      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()
      
    • 스크린 샷 :

get_screenshot_as_file_method.png

  • get_screenshot_as_png()방법을 사용하여 :

    • 코드 블록 :

      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()
      
    • 스크린 샷 :

get_screenshot_as_png_method.png


2

파이썬

Python 웹 드라이버를 사용하여 창에서 이미지를 캡처 할 수 있습니다. 스크린 샷을 캡처해야하는 페이지 아래의 코드를 사용하십시오.

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

4
이 답변은 원래 Python 답변 후 몇 년 후에 게시 된 사본입니다.
— Corey Goldberg

3
또한,이 답변이 경로 이름에 백 슬래시를 이스케이프하지 않습니다 .. 오류의 원인이되는
— 코리 골드버그

또한 설치 코드가 누락 되어이 줄 자체가 작동하지 않습니다.
— 활동 감소

2

자바

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

이 두 가지 방법을 사용하면 날짜와 시간으로 스크린 샷을 찍을 수도 있습니다.


2

자바

스크린 샷 기능으로 노드를 기능 보강 한 후 RemoteWebDriver를 사용하여 스크린 샷을 다음과 같이 저장합니다.

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

필요한 경우이 방법을 사용할 수 있습니다. 그런 다음 surefire-reports / html / custom.css에서 maven-surefire-report-plugin 스타일 시트를 사용자 정의하여 보고서에 각 테스트의 올바른 스크린 샷에 대한 링크를 포함시킬 수 있다고 가정합니다.


요즘 나는 이런 식으로하지 않을 것입니다. 아마 Selenide와 같은 프레임 워크를 사용할 것입니다.
— djangofan

2

자바

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

이것이 문제를 해결하기를 바랍니다.


2

씨#

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

셀레 니즈

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

2

씨#

다음 코드 스 니펫 / 함수를 사용하여 셀레늄으로 스크린 샷을 찍을 수 있습니다.

    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 사용;" 어셈블리.
— ArNumb

SaveAsFile 호출에서이 줄을 사용해야했습니다. ss.SaveAsFile (filename, ScreenshotImageFormat.Png); 또한 경로 + @ "\"에 대해 Path.Combine (폴더, 파일 이름)을 사용하는 것이 더 좋습니다. 더 읽기 좋기 때문에 폴더 / 파일 이름 형식화를 더 용서할 수 있다고 생각합니다 . 개인 취향 만. 따라서 해당 줄은 다음과 같습니다. filename = Path.Combine (path, filename + ".png");
— 개발자


2

자바

TestName 및 Timestamp가 추가 된 Selenium의 실패에 대한 스크린 샷 캡처 방법.

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

1

C # (Ranorex API)

public static void ClickButton()
{
    try
    {
        // code
    }
    catch (Exception e)
    {
        TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
        Report.Screenshot();
        throw (e);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.