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.