Як зробити знімок екрана з Selenium WebDriver


499

Хтось знає, чи можна зробити знімок екрана за допомогою Selenium WebDriver? (Примітка: Не селен RC)


Мабуть, існує лише один спосіб зробити це за допомогою протоколу WebDriver Wire, але ніхто не використовує цей протокол безпосередньо. Натомість люди використовують різні мовні прив’язки / бібліотеки, які завершують протокол низького рівня. Існує багато мовних прив’язок, тому вам потрібно сказати, яке саме ви хочете використовувати. Інакше відповідей просто занадто багато.
oberlies

Яку мову програмування ви використовуєте?
Ріпон Аль Васім

Ви хочете зробити скріншот цілої сторінки чи певного елемента?
Ріпон Аль Васім

Так, можна зробити знімок екрана або на всю сторінку, або на певний елемент із Selenium WebDriver
Ripon Al Wasim

Відповіді:


507

Java

Так, можливо. Наступний приклад - на 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
Копіювання файлу, а не перейменування його, є хорошою ідеєю, якщо є ймовірність, що джерело та пункт призначення можуть бути не в одній файловій системі. Ви не можете перейменовувати через межі файлової системи (принаймні, на unix). Зауважте, що звичайно /tmpбути у власній файловій системі, і FirefoxDriver пише скріншоти /tmp.
Том Андерсон

9
Чи є спосіб зробити це лише для невдалих справ?
some_other_guy

6
Варто зауважити, що HtmlUnitDriverце не реалізується TakesScreenshot(див. Список підтримуваних драйверів) (див. Selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… Але ви можете зберегти як HTML.
Wernight

7
Який пакет потрібно імпортувати для використання класу FileUtils?
Ріпон Аль-Васім

7
@RiponAlWasim, ймовірно,org.apache.commons.io.FileUtils
Бен

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()(для отримання бінарних даних).

та зауважте, що WebElements має .screenshot()метод, який працює аналогічно, але лише фіксує вибраний елемент.


Для інших браузерів обміняйте екземпляр веб-драйвера. Якщо ви просто хочете скріншоти вашого веб-сайту, включаючи штат, подивіться на Usersnap .
Грегор

@ DavidRöthlisberger це все чудово, але ваш коментар не має нічого спільного з моєю відповіддю
Corey Goldberg

Для того, щоб зробити scrennshot на повну сторінку, а не тільки видиму область, використовувати мій пітон код з моєї відповіді тут Стіч: stackoverflow.com/questions/37906704 / ...
Fabian Томмен

1
@CoreyGoldberg Щоправда, нічого спільного з вашою відповіддю. Але мій старий сценарій використовував більш старий FF, і він займав цілу сторінку, а не лише вікно перегляду. Після того як вони змінили його на стандартний, тепер лише вікно перегляду. Тому я хотів допомогти комусь із тією ж проблемою. І так, фіксований елемент - це справжній біль у прокрутці / стичі!
Фабіан Томмен

1
Ще одна річ, яка дуже допомогла мені, якщо вам потрібно змінити розмір зображення, просто встановіть розмір вікна, перш ніж робити знімок за допомогою driver.set_window_size(1366, 728).
ЗіпсованийБрат

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
Працює чудово. Caveat: робить знімок екрана, а не знімок сторінки.
ljgww

ти маєш на увазі, що він отримує робочий стіл і все? Або ти маєш на увазі, що він просто отримує вікно перегляду?
vtortola

Він отримає лише те, що знаходиться в області драйвера, це дозволить проводити кілька паралельних тестів. Зверніть увагу, що воно не зменшиться, якщо у фокусі головного вікна вашого водія є смуга прокрутки або якщо вона перевищує одну сторінку.
Бен

3
оновлення до SaveAsFile (рядок шляху, формат ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Киеран

1
Це працювало для мене! Я використовував CopyFromScreen з простору імен Graphics. Перевага вищевказаного рішення полягає в тому, що воно працює, коли код викликається безголовим способом від TFS. Мій старий метод CopyFromScreen працював лише під час запуску тестів селену з Visual Studio, але ніколи не працював на моїх тестах запуску TFS.
Еван

74

JavaScript (Selenium-Webdriver)

driver.takeScreenshot().then(function(data){
   var base64Data = data.replace(/^data:image\/png;base64,/,"")
   fs.writeFile("out.png", base64Data, 'base64', function(err) {
        if(err) console.log(err);
   });
});

3
Аналогічно тому, як описує це Browserstack: browserstack.com/automate/node#enhancements-screenshots
Майк Каузер

у data.replace що саме ви робите в дужках?
Джон Деметріу

@JohnDemetriou, дані - це ім'я об'єкта чи змінної, які будуть створені при його виклику. Ви можете зателефонувати йому, var1якщо бажаєте. Ви повинні подивитися на takeScreenshot()функцію, щоб знати, що це саме. Можливо, бінарне зображення, відображене з JavaScript за допомогою полотна. Це може бути купол, перш ніж його винесуть. Заглянути.
м3нда

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; вузол, що працює на RedHat EL 4 з Firefox 3.6.18 під Xvfb.
MarkD

1
Чи є спосіб зробити знімок екрана на повній сторінці, а не лише видиму область?
Аріхант Годха

2
Повна сторінка приймається за замовчуванням. Принаймні, використовуючи headlessіFirefox
Ешлі

35

Java

Я вирішив це питання. Ви можете 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 є для мене новим, і я шукаю рішення для створення скріншотів у кількох браузерах та ОС, щоб зробити візуальні тести
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;
}

яким драйвером ви користувалися? новий Augmenter (). збільшення (драйвер);
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 Framework)

Я використовував цей метод для зйомки екрана.

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

Ви можете використовувати цей метод там, де потрібно.


Ваш фокус повинен залишатися весь час у браузері, інакше можна зробити знімок того, на що зараз зосереджено.
кушаль.8

8

Java

Тут, здається, відсутня - знімок екрана певного елемента на 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 + висота) знаходиться поза межами Raster
Ichwardort

Ви спробували код? Це спрацювало, коли я востаннє спробував це.
Еркі М.

1
Це прекрасно спрацьовує, якщо ви намагаєтеся захопити елемент, який видно без прокрутки. Коли вам потрібно перейти до елемента, щоб його захопити, то зсув y обчислюється вгорі сторінки, що потім перевищує межі зображення в повноекранному режимі. Тому найпростішим рішенням є або збільшити розмір екрана codethis.driver.manage (). Window (). SetSize (новий розмір (1680, 1050)); або видалити непотрібні елементи через css. Правильним рішенням було б обчислити y-зміщення від прокрутки.
Ічвордорт

1
Це Firefoxдобре працює, оскільки він обробляє екран елементів із повного зображення на основі розмірів. У Chromeразі , якщо елемент доступний у вигляді частини з поза прокрутки з цієї точкою зору частиною зображення вона захоплює елемент штраф. Якщо ми хочемо зробити скріншот після прокрутки document.documentElement.clientHeightдвох разів клієнта, зростайте, (location.y)-2*clientHeightщоб отримати точний знімок елементів. Дякую за цю посаду, бо мені це допомагає ...
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:

  1. PhantomJS 2.0.0
  2. Селен.Підтримка 2.48.2
  3. Selenium.WebDriver 2.48.2

Перевірено за допомогою .NETFramework v4.5.2


5

Java

Я не міг отримати прийняту відповідь на роботу, але, відповідно до поточної документації на WebDriver , для мене з Java 7 на 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

Рубін (огірок)

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

Яка мова це?
кодигмен

Це схоже на його в рубіні, не використовуючи жодного конкретного веб-драйвера
Джеймс

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

у поточній версії facebook / webdriver метод takeScreenshot (), і не потрібно базувати результат6464_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простір імен.
Адарша

4

Пітон - знімок екрана:

Це досить старе запитання і має кілька відповідей. Однак, здається, знімок екрана певного веб-елемента за допомогою Python тут відсутній.

Розташування

Веб-елемент має свою позицію на сторінці і, як правило, він вимірюється в x і y пікселях і відомий як (x, y) координати елемента. А об’єкт розташування містить два значення.

  1. location ['x'] - повертає координату елемента 'x'
  2. location ['y'] - повертає координату елемента 'y'

розмір

Як і розташування, кожен WebElement має ширину та висоту; Доступний як об'єкт розміру.

  1. size ['width'] - повертає 'width' елемента
  2. size ['height'] - повертає '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

Існує кілька методів 's і клієнт, щоб зробити знімок екрана за допомогою


Методи Java

Нижче наведено різні методи Java для створення знімка екрана :

  • Використання getScreenshotAs()від TakesScreenshot інтерфейсу:

    • Блок коду:

      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 / selenium-shutterbug :

    • Блок коду:

      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

Пітон

Ви можете захопити зображення з Windows за допомогою веб-драйвера python. Використовуйте код нижче, на якій сторінці потрібно зробити знімок екрана

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

4
ця відповідь є дублікатом, який був опублікований через кілька років після оригінальної відповіді Python.
Корі Голдберг

3
також ця відповідь не ухиляється від нахилів у назві шляху .. що призведе до помилки
Corey Goldberg

Також у нього відсутній код налаштування, цей рядок сам по собі не працюватиме.
зменшення активності

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

Використовуючи ці два методи, ви можете зробити знімок екрана з датою та часом.


2

Java

Використовуючи 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();
    }
}

Ви можете використовувати цей метод там, де потрібно. Тоді я припускаю, що ви можете налаштувати таблицю стилів maven-surefire-report-plugin на surefire-messages / html / custom.css, щоб ваші звіти містили посилання на правильний знімок екрана для кожного тесту?


Сьогодні я б не зробив це так. Я, мабуть, використовував би такий фреймворк, як Selenide.
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));

Сподіваюся, це вирішить вашу проблему


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

Селенський

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

2

C #

Ви можете використовувати наступний фрагмент / функцію коду, щоб зробити знімок екрана із селеном:

    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 (ім'я файлу, ScreenshotImageFormat.Png); Я також вважаю за краще використовувати Path.Combine (папку, ім'я файлу) через шлях + @ "\", тому що він читає краще, і я думаю, що це може пробачити більше форматування імен папок / файлів. Тільки особисті переваги. Отже, цей рядок стає: ім'я файлу = Path.Combine (шлях, ім'я файлу + ".png");
Developer63


2

JAVA

Метод зйомки знімка екрана для відмов у Selenium із доданими TestName та Timestamp.

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

Якщо ви вважаєте цю (або будь-яку) відповідь корисною, будь ласка, відправте її. Якщо це відповіло на ваше запитання, будь-ласка, позначте його як прийняту відповідь. Дякую!
Ануй Теотія

1

C # (API Ranorex)

public static void ClickButton()
{
    try
    {
        // code
    }
    catch (Exception e)
    {
        TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
        Report.Screenshot();
        throw (e);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.