Cách chụp ảnh màn hình với Selenium WebDriver


499

Có ai biết nếu có thể chụp ảnh màn hình bằng Selenium WebDriver không? (Lưu ý: Không phải Selen RC)


Có lẽ chỉ có một cách để làm điều này với Giao thức dây WebDriver, nhưng không ai sử dụng giao thức này trực tiếp. Thay vào đó, mọi người sử dụng các ràng buộc ngôn ngữ / thư viện khác nhau bao bọc giao thức cấp thấp. Có vô số ràng buộc ngôn ngữ, vì vậy bạn cần nói cái nào bạn muốn sử dụng. Nếu không, có quá nhiều câu trả lời.
oberlies

Bạn đang sử dụng ngôn ngữ lập trình nào?
Ripon Al Wasim

Bạn có muốn chụp ảnh màn hình của toàn bộ trang hoặc một yếu tố cụ thể không?
Ripon Al Wasim

Có, có thể chụp ảnh màn hình toàn bộ trang hoặc cho một yếu tố cụ thể với Selenium WebDriver
Ripon Al Wasim

Câu trả lời:


507

Java

Vâng, nó là có thể. Ví dụ sau đây là trong 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
Sao chép tệp, thay vì đổi tên tệp, là một ý tưởng tốt nếu có bất kỳ cơ hội nào mà nguồn và đích có thể không nằm trên cùng một hệ thống tệp. Bạn không thể đổi tên qua các ranh giới hệ thống tập tin (ít nhất là trên unix). Lưu ý rằng thông thường /tmplà trên hệ thống tệp của chính nó và FirefoxDriver viết ảnh chụp màn hình /tmp.
Tom Anderson

9
Có cách nào để làm điều đó chỉ cho các trường hợp thất bại?
some_other_guy

6
Điều đáng chú ý là HtmlUnitDriverkhông triển khai TakesScreenshot(xem selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ trộm để biết danh sách các trình điều khiển được hỗ trợ). Nhưng bạn có thể lưu dưới dạng HTML.
Wernight

7
Gói nào được yêu cầu để nhập để sử dụng lớp FileUtils?
Ripon Al Wasim

7
@RiponAlWasim có lẽorg.apache.commons.io.FileUtils
Ben

270

Con trăn

Mỗi WebDriver có một .save_screenshot(filename)phương thức. Vì vậy, đối với Firefox, nó có thể được sử dụng như thế này:

from selenium import webdriver

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

Một cách khó hiểu, một .get_screenshot_as_file(filename)phương pháp cũng tồn tại mà làm điều tương tự.

Ngoài ra còn có các phương thức: .get_screenshot_as_base64()(để nhúng vào html) và .get_screenshot_as_png()(để lấy dữ liệu nhị phân).

và Lưu ý rằng WebElements có một .screenshot()phương thức hoạt động tương tự, nhưng chỉ nắm bắt phần tử được chọn.


Đối với các trình duyệt khác, trao đổi ví dụ webdo. Nếu bạn chỉ muốn ảnh chụp màn hình của trang web của bạn bao gồm cả trạng thái, hãy xem Usersnap .
Gregor

@ DavidRöthlisberger thật tuyệt vời, nhưng nhận xét của bạn không liên quan gì đến câu trả lời của tôi
Corey Goldberg

Để tạo một bản tóm tắt của một trang đầy đủ, không chỉ vùng hiển thị, hãy sử dụng mã python của tôi từ câu trả lời của tôi ở đây để stich: stackoverflow.com/questions/37906704/
Fabian Thommen

1
@CoreyGoldberg Đúng, không có gì để làm với câu trả lời của bạn. Nhưng tập lệnh cũ của tôi đã sử dụng một FF cũ hơn và nó đã chiếm toàn bộ trang, không chỉ là khung nhìn. Sau khi họ thay đổi nó thành tiêu chuẩn bây giờ chỉ có chế độ xem. Vì vậy, tôi muốn giúp ai đó có cùng một vấn đề. Và vâng, yếu tố cố định là một nỗi đau thực sự trong cuộn / stich!
Fabian Thommen

1
Một điều nữa giúp tôi rất nhiều, nếu bạn cần thay đổi kích thước hình ảnh, chỉ cần đặt kích thước cửa sổ trước khi bạn chụp ảnh nhanh bằng cách sử dụng 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
Hoạt động hoàn hảo. Hãy cẩn thận: chụp ảnh màn hình chứ không phải chụp trang.
ljgww

bạn có nghĩa là nó được máy tính để bàn và tất cả mọi thứ? Hoặc bạn có nghĩa là nó chỉ có được khung nhìn?
vtortola

Nó sẽ chỉ nhận được những gì trong phạm vi của trình điều khiển, điều này là để cho phép nhiều thử nghiệm song song diễn ra. Lưu ý rằng nó sẽ không thu nhỏ nếu tiêu điểm cửa sổ chính của trình điều khiển của bạn có thanh cuộn hoặc nếu nó vượt quá một trang.
Ben

3
cập nhật lên SaveAsFile (đường dẫn chuỗi, định dạng ảnh chụp màn hìnhImageFormat) Ảnh chụp màn hìnhImageFormat.Jpeg
Kieran

1
Điều này làm việc cho tôi! Tôi đã sử dụng CopyFromScreen từ không gian tên Đồ họa. Ưu điểm của giải pháp trên là nó hoạt động khi mã được gọi theo cách không đầu từ TFS. Phương thức CopyFromScreen cũ của tôi chỉ hoạt động khi chạy thử nghiệm selen từ Visual Studio nhưng không bao giờ hoạt động cho các thử nghiệm chạy TFS của tôi.
Ewan

74

JavaScript (Selenium-Webdo)

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
Tương tự như cách Browserstack mô tả về nó: browserstack.com/automate/node#enhancements-sc
Greensshots

trong data.replace chính xác bạn đang làm gì trong ngoặc đơn?
John Demetriou

@JohnDemetriou, dữ liệu là tên của đối tượng hoặc biến sẽ được tạo khi bạn gọi nó. Bạn có thể gọi nó var1nếu bạn muốn. Bạn nên nhìn vào takeScreenshot()chức năng để biết chính xác nó là gì. Có thể một hình ảnh nhị phân được kết xuất từ ​​javascript bằng canvas. Nó có thể là dom, trước khi nó được kết xuất. Nhìn vào.
m3nda

66

Hồng ngọc

require 'rubygems'
require 'selenium-webdriver'

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

nhiều loại tệp và tùy chọn có sẵn và bạn có thể thấy chúng trong takes_sc Muff.rb


Làm việc tốt với tôi khi sử dụng Selenium Grid 2. Script và hub chạy trên OS X Snow Leopard; nút chạy trên RedHat EL 4 với Firefox 3.6.18 trong Xvfb.
MarkD

1
Có cách nào để chụp ảnh màn hình toàn trang, không chỉ khu vực hiển thị?
Arihant Godha

2
Toàn bộ trang được lấy theo mặc định. Ít nhất là sử dụng headlessFirefox
Ashley

35

Java

Tôi đã giải quyết vấn đề này. Bạn có thể gia tăng RemoteWebDriverđể cung cấp cho nó tất cả các giao diện mà trình điều khiển được ủy quyền của nó thực hiện:

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

Nếu bạn làm điều đó, thì bạn không cần phải sao chép ảnh chụp màn hình vào tên tệp bằng threadId để bạn có thể biết chủ đề / phiên bản nào của trình điều khiển của bạn đã ném ảnh chụp màn hình? Nếu không, nhiều phiên bản của một trình duyệt trên một nút lưới sẽ ghi đè lên các ảnh chụp màn hình của nhau?
djangofan

1
Tôi muốn chỉ ra rằng chỉ có giải pháp này hiệu quả với tôi khi sử dụng ChromeDriver không đầu
GabrielRado

34

PHP (PHPUnit)

Sử dụng PHPUnit_Selenium phiên bản mở rộng 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! Tôi muốn biết thêm về điều này, Selenium là người mới đối với tôi và tôi đang tìm kiếm một giải pháp cli để tạo ảnh chụp màn hình trên một số trình duyệt và hệ điều hành để thực hiện các bài kiểm tra trực quan
pythonia29033 7/07/2016

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

bạn đã sử dụng trình điều khiển nào? Augmenter mới (). augment (trình điều khiển);
kozla13

12

Con trăn

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 (Khung Robot)

Tôi đã sử dụng phương pháp này để chụp ảnh màn hình.

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

Bạn có thể sử dụng phương pháp này bất cứ nơi nào cần thiết.


Bạn nên tập trung vào trình duyệt mọi lúc, người khác sẽ chụp nhanh bất cứ thứ gì hiện đang tập trung.
kushal.8

8

Java

Có vẻ như bị thiếu ở đây - chụp ảnh màn hình của một yếu tố cụ thể trong 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);
}

Tôi không nghĩ cách tiếp cận này thực tế có thể hoạt động, vì ảnh chụp màn hình và trình duyệt thực tế có độ phân giải khác nhau. Vì vậy, khi sử dụng vị trí tọa độ thu được bởi selenium trên hình ảnh của bạn, bạn chắc chắn sẽ chạy vào java.awt.image.RasterFormatException: (y + height) nằm ngoài Raster
Ichwardort

Bạn đã thử mã chưa? Nó hoạt động khi tôi thử lần cuối.
Erki M.

1
Nó hoạt động hoàn toàn tốt miễn là bạn thử chụp một yếu tố có thể nhìn thấy mà không cần cuộn. Khi bạn cần cuộn đến một yếu tố để chụp nó, thì độ lệch y được tính từ đầu trang, sau đó vượt quá ranh giới của hình ảnh toàn màn hình. Vì vậy, giải pháp đơn giản nhất là tăng kích thước màn hình codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); hoặc để loại bỏ bất kỳ yếu tố không cần thiết thông qua css. Giải pháp thích hợp sẽ là tính toán phần bù y từ cuộn.
Ichwardort

1
Trong Firefoxhoạt động tốt khi nó cắt màn hình thành phần từ Hình ảnh đầy đủ dựa trên Kích thước. Trong Chrometrường hợp phần tử có sẵn trong phần xem mà không cuộn hình ảnh từ phần xem đó, phần tử sẽ chụp phần tử tốt. Nếu chúng tôi muốn chụp ảnh màn hình sau khi cuộn document.documentElement.clientHeighthai lần Chiều cao của khách hàng, hãy sử dụng (location.y)-2*clientHeightđể có được ảnh chụp màn hình phần tử chính xác. Cảm ơn vì bài đăng này vì nó giúp tôi ...
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();
        }
    }
}

Yêu cầu NuGetPackages:

  1. PhantomJS 2.0.0
  2. Selenium. Hỗ trợ 2.48.2
  3. Selenium.WebDriver 2.48.2

Đã thử nghiệm với .NETFramework v4.5.2


5

Java

Tôi không thể nhận được câu trả lời được chấp nhận để làm việc, nhưng theo tài liệu WebDriver hiện tại , phần sau đây hoạt động tốt với tôi với Java 7 trên 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 (dưa chuột)

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

Ngôn ngữ này là gì?
codygman

Điều này trông giống như trong ruby, không sử dụng bất kỳ trình điều khiển web cụ thể nào
James

4

Hồng ngọc

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

trong phiên bản hiện tại của facebook / webdo, phương thức này là TakeSc mãi () và không cần thiết phải tạo cơ sở64_encode () trước khi lưu tệp.
billrichards

1
Bạn có thể vui lòng thêm mã vào ví dụ của bạn để cho biết cách gọi takescreenshothàm này không? Cụ thể $eventbiến đến từ đâu? Tôi là một Selenium noob hoàn chỉnh nên một câu trả lời cho câu hỏi này không cho rằng kiến ​​thức về Selen trước đó sẽ được đánh giá rất cao!
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)

Trình điều khiển khác ...

$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

Có lẽ tốt hơn để sử dụng [OpenQA.Selenium.ScreenshotImageFormat]::Pnghơn System.Drawingkhông gian tên.
Adarsha

4

Python - Ảnh chụp màn hình của Element:

Đây là một câu hỏi khá cũ và có nhiều câu trả lời. Tuy nhiên, dường như việc chụp ảnh màn hình của một thành phần web cụ thể bằng Python bị thiếu ở đây.

vị trí

Một phần tử web có vị trí riêng của nó trên trang và nói chung, nó được đo bằng pixel x và y và được gọi là (x, y) tọa độ của phần tử. Và đối tượng vị trí chứa hai giá trị.

  1. location ['x'] - trả về 'x' phối hợp của phần tử
  2. location ['y'] - trả về 'y' phối hợp của phần tử

kích thước

Giống như vị trí, mỗi WebEuity có chiều rộng và chiều cao; Có sẵn như đối tượng kích thước.

  1. kích thước ['width'] - trả về 'width' của phần tử
  2. kích thước ['height'] - trả về 'height' của phần tử

Sử dụng (x, y) tọa độ và chiều rộng, giá trị chiều cao, chúng ta có thể cắt hình ảnh và lưu trữ nó trong một tệp.

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

Lưu ý: Lấy từ http://allselenium.info/capture-sccam-element-USE-python-selenium-webdo/


Dấu chấm phẩy là gì?
Maikflow

3

Có nhiều phương pháp thông qua 'S khách hàng chụp ảnh màn hình bằng


Phương thức Java

Sau đây là các phương thức Java khác nhau để chụp ảnh màn hình :

  • Sử dụng getScreenshotAs()từ Giao diện TakesSc mãi :

    • Khối mã:

      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();
          }
      }
      
    • Ảnh chụp màn hình:

Mads_Cruz_sccam

  • Nếu trang webjquery cho phép bạn có thể sử dụngtừ thư viện pazone / ashot :

    • Khối mã:

      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();
          }
      }
      
    • Ảnh chụp màn hình:

firefoxSc mãi.png

  • Sử dụng từ thư viện assertthat / selenium-màn trập :

    • Khối mã:

      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();
          }
      }
      
    • Ảnh chụp màn hình:

2019_03_12_16_30_35_787.png


Phương thức Python

Sau đây là các phương thức Python khác nhau để chụp ảnh màn hình :

  • Sử dụng save_screenshot()phương pháp:

    • Khối mã:

      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()
      
    • Ảnh chụp màn hình:

save_sc Muff_method.png

  • Sử dụng get_screenshot_as_file()phương pháp:

    • Khối mã:

      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()
      
    • Ảnh chụp màn hình:

get_sc Muff_as_file_method.png

  • Sử dụng get_screenshot_as_png()phương pháp:

    • Khối mã:

      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()
      
    • Ảnh chụp màn hình:

get_sc Muff_as_png_method.png


2

Con trăn

Bạn có thể chụp ảnh từ windows bằng trình điều khiển web python. Sử dụng mã bên dưới trang nào cần chụp ảnh màn hình

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

4
câu trả lời này là một bản sao được đăng vài năm sau câu trả lời gốc của Python.
Corey Goldberg

3
Ngoài ra, câu trả lời này không thoát khỏi dấu gạch chéo ngược trong tên đường dẫn .. điều này sẽ gây ra lỗi
Corey Goldberg

Ngoài ra, nó thiếu mã thiết lập, dòng này tự nó sẽ không hoạt động.
giảm hoạt động

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

Sử dụng hai phương pháp này, bạn cũng có thể chụp ảnh màn hình theo ngày và giờ.


2

Java

Sử dụng RemoteWebDriver, sau khi tăng cường Node với khả năng chụp màn hình, tôi sẽ lưu trữ ảnh chụp màn hình như sau:

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

Bạn có thể sử dụng phương pháp này bất cứ nơi nào cần thiết. Sau đó, tôi giả sử bạn có thể tùy chỉnh biểu định kiểu của maven-Surefire-báo cáo-plugin tại Surefire-báo cáo / html / custom.css để báo cáo của bạn bao gồm liên kết đến ảnh chụp màn hình chính xác cho mỗi bài kiểm tra?


Ngày nay tôi sẽ không làm theo cách này. Tôi có thể sử dụng một khung như Selenide có thể.
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));

Hy vọng điều này sẽ giải quyết vấn đề của bạn


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 #

Bạn có thể sử dụng đoạn mã / chức năng sau đây để chụp ảnh màn hình với 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);
    }

"sử dụng System.Drawing.Imaging;" hội,, tổ hợp.
ArNumb

Tôi đã phải sử dụng dòng này trong lệnh gọi SaveAsFile: ss.SaveAsFile (tên tệp, Ảnh chụp màn hìnhImageFormat.Png); Tôi cũng thích sử dụng Path.Combine (thư mục, tên tệp) trên đường dẫn + @ "\" vì nó đọc tốt hơn và tôi nghĩ rằng thể tha thứ hơn cho định dạng thư mục / tên tệp. Chỉ sở thích cá nhân. Vì vậy, dòng đó trở thành: filename = Path.Combine (path, filename + ".png");
Nhà phát


2

JAVA

Phương pháp để chụp ảnh màn hình cho các lỗi trong Selenium với TestName và Dấu thời gian được nối thêm.

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

Nếu bạn thấy câu trả lời này (hoặc bất kỳ) hữu ích, vui lòng nâng cấp nó. Nếu điều này trả lời câu hỏi của bạn, xin vui lòng đánh dấu nó là câu trả lời được chấp nhận. Cảm ơn!
Anuj Teotia

1

C # (API Ranorex)

public static void ClickButton()
{
    try
    {
        // code
    }
    catch (Exception e)
    {
        TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
        Report.Screenshot();
        throw (e);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.