Как сделать скриншот с Selenium WebDriver

498

Кто-нибудь знает, можно ли сделать скриншот с помощью Selenium WebDriver? (Примечание: не Selenium RC)

Джеймс Холлингворт
источник
Вероятно, есть только один способ сделать это с WebDriver Wire Protocol, но никто не использует этот протокол напрямую. Вместо этого люди используют разные языковые привязки / библиотеки, которые обертывают протокол низкого уровня. Существует множество языковых привязок, поэтому вам нужно указать, какую из них вы хотите использовать. В противном случае ответов слишком много.
oberlies
Какой язык программирования вы используете?
Рипон Аль-Васим
Вы хотите сделать скриншот всей страницы или конкретного элемента?
Рипон Аль-Васим
Да, с помощью Selenium WebDriver можно сделать снимок экрана либо для всей страницы, либо для конкретного элемента
Ripon Al Wasim,

Ответы:

506

Ява

Да, это возможно. Следующий пример на 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.
Вечерняя ночь
7
Какой пакет требуется импортировать для использования класса FileUtils?
Рипон Аль Васим
7
@RiponAlWasim, вероятноorg.apache.commons.io.FileUtils
Бен
270

питон

У каждого 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()метод, который работает аналогично, но захватывает только выбранный элемент.

Кори Голдберг
источник
Для других браузеров замените экземпляр webdriver. Если вам нужны скриншоты вашего сайта, включая состояние, посмотрите на Usersnap .
Грегор
@ DavidRöthlisberger это все здорово, но ваш комментарий не имеет ничего общего с моим ответом
Кори Голдберг
Чтобы сделать снимок полной страницы, а не только видимой области, используйте мой код на python из моего ответа на stich: stackoverflow.com/questions/37906704/…
Fabian Thommen
1
@CoreyGoldberg Правда, ничего общего с твоим ответом. Но мой старый скрипт использовал более старую FF, и он занимал всю страницу, а не только область просмотра. После того как они изменили его на стандартный, теперь только видовой экран. Поэтому я хотел помочь кому-то, у кого была такая же проблема. И да, фиксированный элемент - настоящая боль в свитке / стиче!
Фабиан Томмен
1
Еще одна вещь, которая мне очень помогла, если вам нужно изменить размер изображения, просто установите размер окна, прежде чем делать снимок с помощью 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
Работает отлично. Предостережение: снимок экрана, а не снимок страницы.
ljgww
Вы имеете в виду, что он получает рабочий стол и все? Или вы имеете в виду, что он просто получает окно просмотра?
Втортола
Он получит только то, что находится в области действия драйвера, это позволит провести несколько параллельных тестов. Обратите внимание, что он не будет уменьшаться, если фокус главного окна вашего драйвера имеет полосу прокрутки или если он превышает одну страницу.
Бен
3
обновить до SaveAsFile (путь строки, формат ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran
1
Это сработало для меня! Я использовал CopyFromScreen из пространства имен Graphics. Преимущество вышеуказанного решения состоит в том, что оно работает, когда код вызывается безголовым способом из TFS. Мой старый метод CopyFromScreen работал только при запуске тестов селена из Visual Studio, но никогда не работал для моих тестов запуска TFS.
Ewan
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
в data.replace, что именно вы делаете в скобках?
Джон Деметриу
@JohnDemetriou, data - это имя объекта или переменной, которая будет создана при ее вызове. Вы можете позвонить, var1если хотите. Вы должны посмотреть на takeScreenshot()функцию, чтобы знать, что это такое. Может быть, двоичное изображение от javascript с использованием canvas. Это может быть дом, прежде чем он будет оказан. Посмотри в.
m3nda
66

Рубин

require 'rubygems'
require 'selenium-webdriver'

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

доступно больше типов файлов и опций, и вы можете увидеть их в take_screenshot.rb

sirclesam
источник
У меня все работало нормально с использованием Selenium Grid 2. Скрипт и хаб, работающие на OS X Snow Leopard; узел работает на RedHat EL 4 с Firefox 3.6.18 под Xvfb.
MarkD
1
Есть ли способ сделать полный снимок экрана, а не только видимую область?
Арихант Годха,
2
Полная страница берется по умолчанию. По крайней мере, используя headlessиFirefox
Эшли
35

Ява

Я получил эту проблему решена. Вы можете расширить его, RemoteWebDriverчтобы дать ему все интерфейсы, которые реализует его прокси-драйвер:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
user708910
источник
Если вы сделаете это, то вам не нужно копировать снимки экрана в имя файла с помощью threadId, чтобы вы могли сказать, какие потоки / экземпляры вашего драйвера сгенерировали снимок экрана? В противном случае, несколько экземпляров браузера на одном узле сетки будут перезаписывать скриншоты друг друга?
Джангофан
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');
    }
    ...
}
Райан Митчелл
источник
daaaamn! Я хочу знать больше об этом, 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);
}
wsbaser
источник
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;
}
SilverColt
источник
какой драйвер ты использовал? новый Augmenter (). augment (драйвер);
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();
    }
}

Вы можете использовать этот метод везде, где это необходимо.

апк
источник
Ваше внимание должно быть постоянно сосредоточено на браузере, иначе будет сделан снимок того, что в данный момент сфокусировано.
kushal.8
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);
}
Эрки М.
источник
Я не думаю, что этот подход может работать, так как скриншот и реальный браузер имеют разные разрешения. Таким образом, при использовании координатного положения, полученного селеном, на вашем изображении вы наверняка
столкнетесь
Вы пробовали код? Это сработало, когда я в последний раз попробовал это.
Эрки М.
1
Он отлично работает, пока вы пытаетесь захватить элемент, который виден без прокрутки. Когда вам нужно прокрутить до элемента, чтобы захватить его, тогда смещение по y вычисляется из верхней части страницы, которая затем выходит за границы полноэкранного изображения. Поэтому самое простое решение - увеличить размер экрана codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); или удалить любые ненужные элементы через CSS. Правильным решением было бы рассчитать смещение по оси Y от прокрутки.
Ichwardort
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. Selenium.Support 2.48.2
  3. Selenium.WebDriver 2.48.2

Протестировано с .NETFramework v4.5.2

userlond
источник
5

Ява

Я не мог получить принятый ответ для работы, но согласно текущей документации по 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
Виджай Чухан
источник
Что это за язык?
Codygman
Это выглядит как в рубине, без использования какого-либо конкретного веб-драйвера
Джеймс
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 () и нет необходимости в base64_encode () выводить перед сохранением файла.
билликарды
1
Не могли бы вы добавить код к вашему примеру, который показывает, как вызвать эту takescreenshotфункцию? В частности, откуда берется $eventпеременная? Я полный селен Noob, поэтому ответ на этот вопрос, который не предполагает, что предварительные знания 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
TechSpud
источник
Вероятно, лучше использовать, [OpenQA.Selenium.ScreenshotImageFormat]::Pngчем System.Drawingпространство имен.
Адарша
4

Python - Скриншот элемента:

Это довольно старый вопрос и имеет несколько ответов. Однако кажется, что снимок экрана определенного веб-элемента с использованием Python здесь отсутствует.

расположение

Веб-элемент имеет свою собственную позицию на странице и обычно измеряется в пикселях x и y и известен как (x, y) координаты элемента. И местоположение объекта содержит два значения.

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

размер

Как и местоположение, каждый WebElement имеет ширину и высоту; Доступен как размер объекта.

  1. size ['width'] - возвращает 'width' элемента
  2. size ['height'] - возвращает 'height' элемента

Используя координаты (x, y) и значения width, height, мы можем обрезать изображение и сохранить его в файле.

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/

Arun211
источник
Что с точкой с запятой?
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 включен , то вы можете использоватьиз библиотеки пазона / ашота :

    • Блок кода:

      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

Ниже приведены различные методы 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

DebanjanB
источник
2

питон

Вы можете захватить изображение из окон, используя веб-драйвер python. Используйте код ниже, на какой странице нужно сделать снимок экрана

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
Kv.senthilkumar
источник
4
Этот ответ является дубликатом, который был опубликован через несколько лет после первоначального ответа Python.
Кори Голдберг
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();
    }
}

Вы можете использовать этот метод везде, где это необходимо. Затем, я полагаю, вы можете настроить таблицу стилей maven-surefire-report-plugin по адресу surefire-reports / html / custom.css, чтобы ваши отчеты содержали ссылку на правильный снимок экрана для каждого теста?

djangofan
источник
В настоящее время я бы так не поступил. Я бы использовал фреймворк вроде Selenide, наверное.
Джангофан
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

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);
}
dmeehan
источник
2

Selenese

captureEntirePageScreenshot | /path/to/filename.png | background=#ccffdd
Bernát
источник
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 (filename, ScreenshotImageFormat.Png); Я также предпочитаю использовать Path.Combine (папка, имя файла) по пути + @ "\", потому что он читается лучше, и я думаю, что он может быть более щадящим для формата папок / имен файлов. Только личные предпочтения. Таким образом, эта строка становится: filename = Path.Combine (path, filename + ".png");
Developer63
2

ЯВА

Метод захвата экрана для сбоев в 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();
      }
   }
Ануй Теотия
источник
Если вы нашли этот (или любой) ответ полезным, пожалуйста, проголосуйте за него. Если это ответило на ваш вопрос, отметьте его как принятый ответ. Спасибо!
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);
    }
}
Бенни Мид
источник