529 votes

Comment faire une capture d'écran avec Selenium WebDriver ?

Est-il possible de faire une capture d'écran à l'aide de Selenium WebDriver ?

(Note : Pas Télécommande Selenium )

0 votes

Il n'y a probablement qu'un seul moyen de le faire avec le protocole Wire de WebDriver, mais personne n'utilise ce protocole directement. Au lieu de cela, les gens utilisent différentes liaisons de langage/bibliothèques qui enveloppent le protocole de bas niveau. Il existe de nombreuses liaisons de langage, il faut donc préciser celle que l'on souhaite utiliser. Sinon, il y a trop de réponses.

0 votes

Quel langage de programmation utilisez-vous ?

0 votes

Voulez-vous faire une capture d'écran de la page entière ou d'un élément spécifique ?

537voto

Sergii Pozharov Points 6214

Java

Oui, c'est possible. L'exemple suivant est en 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"));

33 votes

Copier le fichier, plutôt que de le renommer, est une bonne idée s'il y a une chance que la source et la destination ne soient pas sur le même système de fichiers. Vous ne pouvez pas renommer un fichier au-delà des limites du système de fichiers (sous Unix, du moins). Notez qu'il est courant pour /tmp pour être sur son propre système de fichiers, et FirefoxDriver écrit les captures d'écran à /tmp .

9 votes

Existe-t-il un moyen de le faire uniquement pour les cas d'échec ?

0 votes

Vous pouvez faire une copie éparse et obtenir de meilleures performances lorsqu'ils sont sur le même système de fichiers.

304voto

Corey Goldberg Points 15625

Python

Chaque WebDriver possède un .save_screenshot(filename) méthode. Ainsi, pour Firefox, elle peut être utilisée comme suit :

from selenium import webdriver

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

De façon déroutante, un .get_screenshot_as_file(filename) Il existe également une méthode qui fait la même chose.

Il existe également des méthodes pour : .get_screenshot_as_base64() (pour l'intégration dans le HTML) et .get_screenshot_as_png() (pour récupérer des données binaires).

Et note que les WebElements ont un .screenshot() qui fonctionne de manière similaire, mais qui ne capture que l'élément sélectionné.

0 votes

Pour les autres navigateurs, échangez l'instance webdriver. Si vous voulez simplement des captures d'écran de votre site web, y compris l'état, jetez un coup d'oeil à Usersnap .

0 votes

@DavidRöthlisberger c'est très bien, mais votre commentaire n'a rien à voir avec ma réponse.

0 votes

Pour faire un scrennshot d'une page entière, pas seulement de la zone visible, utilisez mon code python de ma réponse ici à stich : stackoverflow.com/questions/37906704/

115voto

jessica Points 152

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

10 votes

Fonctionne parfaitement. Attention : il s'agit d'une capture d'écran et non d'une capture de page.

0 votes

Vous voulez dire qu'il devient bureau et tout ? Ou bien qu'il n'obtient que la fenêtre d'affichage ?

0 votes

Il n'obtiendra que ce qui se trouve dans la portée du pilote, ceci afin de permettre la réalisation de plusieurs tests parallèles. Notez qu'il ne fera pas de zoom arrière si la fenêtre principale de votre pilote a une barre de défilement ou si elle dépasse une seule page.

81voto

Moiz Raja Points 1801

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 votes

Similaire à la façon dont Browserstack le décrit : browserstack.com/automate/node#enhancements-screenshots

0 votes

Dans data.replace, que faites-vous exactement dans les parenthèses ?

0 votes

@JohnDemetriou, data est le nom de l'objet ou de la variable qui sera créée lorsque vous l'appellerez. Vous pouvez l'appeler var1 si vous le souhaitez. Vous devriez regarder takeScreenshot() fonction pour savoir ce que c'est exactement. Peut-être une image binaire rendue à partir de javascript en utilisant canvas. Ça peut être le dom, avant qu'il ne soit rendu. Regarde dans.

69voto

sirclesam Points 211

Ruby

require 'rubygems'
require 'selenium-webdriver'

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

D'autres types de fichiers et options sont disponibles et vous pouvez les voir dans le fichier takes_screenshot.rb .

0 votes

Cela a bien fonctionné pour moi en utilisant Selenium Grid 2. script et hub fonctionnant sur OS X Snow Leopard ; nœud fonctionnant sur RedHat EL 4 avec Firefox 3.6.18 sous Xvfb.

2 votes

Existe-t-il un moyen de faire une capture d'écran de la page entière, et pas seulement de la zone visible ?

2 votes

La page entière est prise par défaut. Au moins en utilisant headless y Firefox

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X