selenium-webdriver - selenium screenshot python
Tome una captura de pantalla con Selenium WebDriver (30)
C # (API Ranorex)
public static void ClickButton()
{
try
{
// code
}
catch (Exception e)
{
TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
Report.Screenshot();
throw (e);
}
}
¿Alguien sabe si es posible tomar una captura de pantalla con Selenium WebDriver? (Nota: No es selenio RC)
DO#
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);
}
DO#
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);
}
DO#
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;
}
}
DO#
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();
}
}
}
Requiere NuGetPackages:
- PhantomJS 2.0.0
- Selenium.Support 2.48.2
- Selenium.WebDriver 2.48.2
Probado con .NETFramework v4.5.2
Java (Robot Framework)
Utilicé este método para tomar la captura de pantalla.
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();
}
}
Puede utilizar este método siempre que sea necesario.
Java
No pude obtener la respuesta aceptada para trabajar, pero según la documentación actual de WebDriver , lo siguiente me funcionó bien con Java 7 en 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);
}
}
Java
Parece que falta aquí: tomar una captura de pantalla de un elemento específico en 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
Pensé que daría mi solución completa, ya que hay dos formas diferentes de obtener una captura de pantalla. Uno es del navegador local y el otro es del navegador remoto. Incluso incrusté la imagen en el informe html
@After()
public void selenium_after_step(Scenario scenario) throws IOException, JSONException {
if (scenario.isFailed()){
scenario.write("Current URL = " + driver.getCurrentUrl() + "/n");
try{
driver.manage().window().maximize(); //Maximize window to get full screen for chrome
}catch (org.openqa.selenium.WebDriverException e){
System.out.println(e.getMessage());
}
try {
if(isAlertPresent()){
Alert alert = getAlertIfPresent();
alert.accept();
}
byte[] screenshot;
if(false /*Remote Driver flow*/) { //Get Screen shot from remote driver
Augmenter augmenter = new Augmenter();
TakesScreenshot ts = (TakesScreenshot) augmenter.augment(driver);
screenshot = ts.getScreenshotAs(OutputType.BYTES);
} else { //get screen shot from local driver
//local webdriver user flow
screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
}
scenario.embed(screenshot, "image/png"); //Embed image in reports
} catch (WebDriverException wde) {
System.err.println(wde.getMessage());
} catch (ClassCastException cce) {
cce.printStackTrace();
}
}
//seleniumCleanup();
}
Java
Sí, es posible. El siguiente ejemplo 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"));
Java
Tengo este problema resuelto Puede aumentar el RemoteWebDriver
para darle a todas las interfaces los implementos de sus controladores proxy:
WebDriver augmentedDriver = new Augmenter().augment(driver);
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
Java
Usando RemoteWebDriver, después de aumentar el Nodo con la capacidad de captura de pantalla, almacenaría la captura de pantalla de la siguiente manera:
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();
}
}
Puede utilizar este método siempre que sea necesario. Entonces, asumo que puede personalizar la hoja de estilo de maven-surefire-report-plugin en surefire-reports / html / custom.css para que sus informes incluyan el enlace a la captura de pantalla correcta para cada prueba.
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 esto resuelva tu problema
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 estos dos métodos, también puede tomar una captura de pantalla con la fecha y la hora.
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;
}
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);
});
});
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"))
PHP (PHPUnit)
Utiliza la extensión PHPUnit_Selenium versión 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'');
}
...
}
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));
}
}
Pitón
Cada WebDriver tiene un .save_screenshot(filename)
. Entonces para Firefox, se puede usar así:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get(''http://www.google.com/'')
browser.save_screenshot(''screenie.png'')
browser.quit()
Confusamente, también existe un método .get_screenshot_as_file(filename)
que hace lo mismo.
También hay métodos para: .get_screenshot_as_base64()
(para incrustar en html) y .get_screenshot_as_png()
(para recuperar datos binarios).
y tenga en cuenta que WebElements tiene un método .screenshot()
que funciona de manera similar, pero solo captura el elemento seleccionado.
Pitón
Puedes capturar la imagen desde Windows usando el controlador web de Python. Usa el código debajo del cual la página necesita capturar la captura de pantalla
driver.save_screenshot(''c:/foldername/filename.extension(png,jpeg)'')
Pitón
def test_url(self):
self.driver.get("https://www.google.com/")
self.driver.save_screenshot("test.jpg")
Guardará la captura de pantalla en el mismo directorio donde se guarda el script.
Potencia Shell
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)
Otros conductores ...
$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
Rubí
require ''rubygems''
require ''selenium-webdriver''
driver = Selenium::WebDriver.for :ie
driver.get "https://www.google.com"
driver.save_screenshot("./screen.png")
hay más tipos de archivos y opciones disponibles y puede verlos en takes_screenshot.rb
Rubí
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
Ruby (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
Selenese
captureEntirePageScreenshot | /path/to/filename.png | background=#ccffdd
Selenide / Java
Así es como lo hace el proyecto Selenide , haciendo más fácil que cualquier otra forma de hacerlo:
import static com.codeborne.selenide.Selenide.screenshot;
screenshot("my_file_name");
Para Junit:
@Rule
public ScreenShooter makeScreenshotOnFailure =
ScreenShooter.failedTests().succeededTests();
Para TestNG:
import com.codeborne.selenide.testng.ScreenShooter;
@Listeners({ ScreenShooter.class})
Puedes darle una oportunidad a AShot API. Aquí está el enlace github para el mismo.
https://github.com/yandex-qatools/ashot
Algunas de las pruebas aquí ...
DO#
Puede utilizar el siguiente fragmento de código / función para tomar una captura de pantalla con el selenio:
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);
}