Як зробити знімок екрана з 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.