selenium-webdriver screenshot

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:

  1. PhantomJS 2.0.0
  2. Selenium.Support 2.48.2
  3. 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})



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