Como tirar uma captura de tela com o Selenium WebDriver

498

Alguém sabe se é possível tirar uma captura de tela usando o Selenium WebDriver? (Nota: Não Selenium RC)

James Hollingworth
fonte
Provavelmente, existe apenas uma maneira de fazer isso com o WebDriver Wire Protocol, mas ninguém usa esse protocolo diretamente. Em vez disso, as pessoas usam bibliotecas / associações de idiomas diferentes que envolvem o protocolo de baixo nível. Existem muitas ligações de idiomas, então você precisa dizer qual delas deseja usar. Caso contrário, há muitas respostas.
Oberlies
Qual linguagem de programação você está usando?
Ripon Al Wasim 12/04
Deseja tirar uma captura de tela da página inteira ou de um elemento específico?
Ripon Al Wasim 12/04
Sim, é possível tomar captura de ecrã página inteira ou para um elemento específico com selênio WebDriver
Ripon Al Wasim

Respostas:

506

Java

Sim, é possível. O exemplo a seguir está em 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"));
Sergii Pozharov
fonte
30
Copiar o arquivo, em vez de renomeá-lo, é uma boa idéia, se houver alguma chance de a origem e o destino não estarem no mesmo sistema de arquivos. Você não pode renomear através dos limites do sistema de arquivos (no unix, pelo menos). Observe que é comum /tmpestar em seu próprio sistema de arquivos e o FirefoxDriver grava capturas de tela /tmp.
Tom Anderson
9
Existe uma maneira de fazer isso apenas para casos com falha?
some_other_guy
6
Vale ressaltar que HtmlUnitDriverisso não é implementado TakesScreenshot(consulte selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/… para obter uma lista dos drivers suportados). Mas você pode salvar como HTML.
Wernight
7
Qual pacote é necessário para importar para usar a classe FileUtils?
Ripon Al Wasim
7
@RiponAlWasim provavelmenteorg.apache.commons.io.FileUtils
Ben
270

Pitão

Cada WebDriver tem um .save_screenshot(filename)método. Portanto, para o Firefox, ele pode ser usado assim:

from selenium import webdriver

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

Confusamente, .get_screenshot_as_file(filename)também existe um método que faz a mesma coisa.

Existem também métodos para: .get_screenshot_as_base64()(para incorporar em html) e .get_screenshot_as_png()(para recuperar dados binários).

e Observe que os WebElements têm um .screenshot()método que funciona de maneira semelhante, mas captura apenas o elemento selecionado.

Corey Goldberg
fonte
Para outros navegadores, troque a instância do webdriver. Se você quiser apenas capturas de tela do seu site, incluindo estado, dê uma olhada no Usersnap .
Gregor
@ DavidRöthlisberger isso é tudo muito bem, mas o seu comentário tem nada a ver com a minha resposta
Corey Goldberg
Para fazer uma scrennshot de uma página inteira, não apenas a área visível, usar o meu código python da minha resposta aqui para Stich: stackoverflow.com/questions/37906704/...
Fabian Thommen
1
@CoreyGoldberg É verdade, nada a ver com sua resposta. Mas meu script antigo usava um FF mais antigo e levou toda a página, não apenas a janela de visualização. Depois que eles mudaram para padrão agora, apenas viewport. Então, eu queria ajudar alguém com o mesmo problema. E sim, elemento fixo é uma verdadeira dor no scroll / stich!
Fabian Thommen
1
Mais uma coisa que me ajudou imensamente, se você precisar alterar a dimensão da imagem, basta definir o tamanho da janela antes de tirar o instantâneo usando driver.set_window_size(1366, 728).
precisa
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;
    }
}
jessica
fonte
9
Funciona perfeitamente. Advertência: faz uma captura de tela e não uma página.
Ljgww
você quer dizer que fica desktop e tudo? Ou você quer dizer que apenas recebe a janela de exibição?
precisa saber é o seguinte
Ele obterá apenas o que está no escopo do driver, isso permitirá que vários testes paralelos ocorram. Observe que ele não diminuirá o zoom se o foco da janela principal do driver tiver uma barra de rolagem ou se exceder uma única página.
Ben
3
atualize para SaveAsFile (caminho da cadeia de caracteres, formato ScreenshotImageFormat) ScreenshotImageFormat.Jpeg
Kieran
1
Isso funcionou para mim! Eu estava usando CopyFromScreen no namespace Graphics. A vantagem da solução acima é que ela funciona quando o código é chamado de maneira decapitada pelo TFS. Meu antigo método CopyFromScreen funcionava apenas ao executar testes de selênio no Visual Studio, mas nunca funcionava para os testes de execução do 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);
   });
});
Moiz Raja
fonte
3
Semelhante ao modo como o Browserstack o descreve: browserstack.com/automate/node#enhancements-screenshots
Mike Causer 24/12/13
em data.replace o que exatamente você está fazendo entre parênteses?
John Demetriou
@JohnDemetriou, data é o nome do objeto ou variável que será criado quando você o chamar. Você pode chamá-lo, var1se desejar. Você deve olhar para a takeScreenshot()função para saber exatamente o que é. Talvez uma imagem binária renderizada em javascript usando canvas. Pode ser o dom, antes de ser renderizado. Investigar.
M3nda
66

Rubi

require 'rubygems'
require 'selenium-webdriver'

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

mais tipos e opções de arquivos estão disponíveis e você pode vê-los em takes_screenshot.rb

sirclesam
fonte
Funcionou bem para mim usando o Selenium Grid 2. Script e hub em execução no OS X Snow Leopard; nó em execução no RedHat EL 4 com Firefox 3.6.18 no Xvfb.
MarkD
1
Existe alguma maneira de tirar a captura de tela da página inteira, não apenas a área visível?
Arihant Godha 28/08/14
2
A página inteira é obtida por padrão. Pelo menos usando headlesseFirefox
Ashley
35

Java

Eu resolvi esse problema. Você pode aumentar o RemoteWebDriverpara fornecer a todas as interfaces que o driver proxy implementado:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
user708910
fonte
Se você fizer isso, não precisará copiar capturas de tela para um nome de arquivo com threadId, para poder saber quais threads / instâncias do seu driver lançaram a captura de tela? Caso contrário, várias instâncias de um navegador em um nó da grade substituiriam as capturas de tela umas das outras?
djangofan
1
Gostaria de salientar que apenas esta solução funcionou para mim usando o ChromeDriver sem cabeça
GabrielRado 10/10
34

PHP (PHPUnit)

Usa a extensão PHPUnit_Selenium versão 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');
    }
    ...
}
Ryan Mitchell
fonte
daaaamn! Eu quero saber mais sobre isso, selênio é novo para mim e eu estou procurando uma solução cli para screenshots criando toda uma série de navegadores e sistemas operacionais para fazer testes visuais
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
fonte
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;
}
SilverColt
fonte
qual driver você usou? novo Augmenter (). augment (driver);
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"))
Fresh Mind
fonte
9

Java (Estrutura do robô)

Eu usei esse método para tirar uma captura de tela.

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

Você pode usar esse método sempre que necessário.

ank
fonte
Seu foco deve permanecer no navegador o tempo todo, caso contrário, tira instantâneos do que estiver focado no momento.
kushal.8
8

Java

Parece estar faltando aqui - captura de tela de um elemento específico em 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);
}
Erki M.
fonte
Não acho que essa abordagem real possa funcionar, pois a captura de tela e o navegador real têm resoluções diferentes. Então, quando usando o local de coordenadas obtidas por selênio em sua imagem você tem certeza de correr em uma java.awt.image.RasterFormatException: (y + altura) está fora do Raster
Ichwardort
Você tentou o código? Funcionou quando eu tentei pela última vez.
precisa
1
Funciona perfeitamente bem, desde que você tente capturar um elemento visível sem rolagem. Quando você precisa rolar para um elemento para capturá-lo, o deslocamento y é calculado na parte superior da página, que excede os limites da imagem em tela cheia. Portanto, a solução mais fácil é aumentar o tamanho da tela codethis.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); ou remover quaisquer elementos não necessários via css. A solução adequada seria calcular o deslocamento y da rolagem.
Ichwardort
1
Em Firefoxobras muito bem como ela surge na tela elemento integral Imagem baseada em dimensões. Em Chromese o elemento está disponível em parte vista com a rolar a partir dessa imagem porção vista que capta elemento bem. Se quisermos capturar a tela depois de rolar document.documentElement.clientHeightduas vezes a altura do cliente, use (location.y)-2*clientHeightpara obter a captura de tela exata do elemento. Obrigado por este post como isso me ajuda ...
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();
        }
    }
}

Requer NuGetPackages:

  1. PhantomJS 2.0.0
  2. Selenium.Support 2.48.2
  3. Selenium.WebDriver 2.48.2

Testado com .NETFramework v4.5.2

userlond
fonte
5

Java

Não consegui obter a resposta aceita para o trabalho, mas, de acordo com a documentação atual do WebDriver , o seguinte funcionou bem para mim com o Java 7 no 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);
   }
}
Steve HHH
fonte
4

Rubi (Pepino)

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
vijay chouhan
fonte
Que língua é essa?
codygman
Isto se parece com seu rubi, não usando qualquer qualquer driver específico web
James
4

Rubi

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
vijay chouhan
fonte
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));
    }
  }
Arpan Buch
fonte
na versão atual do facebook / webdriver, o método é takeScreenshot () e não é necessário base64_encode () a saída antes de salvar o arquivo.
billrichards
1
Você poderia adicionar um código ao seu exemplo que mostre como chamar essa takescreenshotfunção? Especificamente de onde vem a $eventvariável? Eu sou um noob completo de selênio, portanto, uma resposta a essa pergunta que não pressupõe conhecimento prévio sobre selênio seria muito apreciada!
precisa saber é o seguinte
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)

Outros drivers ...

$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
fonte
Provavelmente é melhor usar do [OpenQA.Selenium.ScreenshotImageFormat]::Pngque System.Drawingespaço para nome.
Adarsha
4

Python - Tela do elemento:

Esta é uma pergunta bastante antiga e tem várias respostas. No entanto, parece que a captura de tela de um elemento da Web específico usando Python está ausente aqui.

localização

Um elemento da web possui sua própria posição na página e geralmente é medido em pixels xey, conhecido como coordenadas (x, y) do elemento. E o objeto de localização contém dois valores.

  1. location ['x'] - retorna a coordenada 'x' do elemento
  2. location ['y'] - retorna a coordenada 'y' do elemento

Tamanho

Como a localização, cada WebElement tem largura e altura; Disponível como objeto de tamanho.

  1. size ['width'] - retorna 'width' do elemento
  2. tamanho ['altura'] - retorna 'altura' do elemento

Usando coordenadas (x, y) e valores de largura e altura, podemos cortar a imagem e armazená-la em um arquivo.

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

Nota: Retirado de http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/

Arun211
fonte
O que há com o ponto e vírgula?
Maikflow 21/07/19
3

Existem vários métodos através de é e cliente para tirar uma captura de tela usando


Métodos Java

A seguir, estão os diferentes métodos Java para tirar uma captura de tela :

  • Usando getScreenshotAs()da interface TakesScreenshot :

    • Bloco de código:

      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();
          }
      }
      
    • Captura de tela:

Mads_Cruz_screenshot

  • Se a página da web estiver ativada para jquery, você poderá usarda biblioteca pazone / ashot :

    • Bloco de código:

      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();
          }
      }
      
    • Captura de tela:

firefoxScreenshot.png

  • Usando da biblioteca assertthat / selenium-shutterbug :

    • Bloco de código:

      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();
          }
      }
      
    • Captura de tela:

2019_03_12_16_30_35_787.png


Métodos Python

A seguir, estão os diferentes métodos Python para fazer uma captura de tela :

  • Usando o save_screenshot()método:

    • Bloco de código:

      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()
      
    • Captura de tela:

save_screenshot_method.png

  • Usando o get_screenshot_as_file()método:

    • Bloco de código:

      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()
      
    • Captura de tela:

get_screenshot_as_file_method.png

  • Usando o get_screenshot_as_png()método:

    • Bloco de código:

      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()
      
    • Captura de tela:

get_screenshot_as_png_method.png

DebanjanB
fonte
2

Pitão

Você pode capturar a imagem do Windows usando o driver da web python. Use o código abaixo da página que precisa capturar a captura de tela

driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
Kv.senthilkumar
fonte
4
essa resposta é uma duplicata publicada vários anos após a resposta original do Python.
Corey Goldberg
3
Além disso, esta resposta não escapa barras invertidas no nome do caminho .. que fará com que um erro
Corey Goldberg
Além disso, está faltando código de instalação, essa linha por si só não funcionará.
reduzindo a atividade
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;
}

Usando esses dois métodos, você também pode tirar uma captura de tela com a data e a hora.

Raghuveer
fonte
2

Java

Usando o RemoteWebDriver, depois de aumentar o Node com capacidade de captura de tela, eu armazenaria a captura de tela da seguinte forma:

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

Você pode usar esse método sempre que necessário. Então, suponho que você possa personalizar a folha de estilos do maven-surefire-report-plugin em surefire-reports / html / custom.css, para que seus relatórios incluam o link da captura de tela correta para cada teste?

djangofan
fonte
Hoje em dia eu não faria dessa maneira. Eu usaria uma estrutura como Selenide provavelmente.
22416 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));

Espero que isso resolva seu problema

Yerram Naveen
fonte
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
fonte
2

Selenese

captureEntirePageScreenshot | /path/to/filename.png | background=#ccffdd
Bernát
fonte
2

C #

Você pode usar o seguinte trecho de código / função para tirar uma captura de tela com o selênio:

    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);
    }
Mohsin Awan
fonte
"using System.Drawing.Imaging;" montagem.
ArNumb 22/01
Eu tive que usar esta linha na chamada SaveAsFile: ss.SaveAsFile (filename, ScreenshotImageFormat.Png); Também prefiro usar Path.Combine (pasta, nome do arquivo) sobre o caminho + @ "\" porque ele é melhor e acho que pode ser mais tolerante com a pasta / nome do arquivo formatation.variations. Apenas preferência pessoal. Então essa linha se torna: filename = Path.Combine (path, filename + ".png");
Developer63
2

JAVA

Método para capturar a captura de tela das falhas no Selenium com TestName e Timestamp anexados.

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
fonte
Se você achou esta (ou alguma) resposta útil, faça um voto positivo. Se isso respondeu à sua pergunta, marque-a como a resposta aceita. Obrigado!
Anuj Teotia 01/04
1

C # (API Ranorex)

public static void ClickButton()
{
    try
    {
        // code
    }
    catch (Exception e)
    {
        TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
        Report.Screenshot();
        throw (e);
    }
}
Benny Meade
fonte