Weiß jemand, ob es möglich ist, mit Selenium WebDriver einen Screenshot zu machen? (Hinweis: Nicht Selen RC)
Weiß jemand, ob es möglich ist, mit Selenium WebDriver einen Screenshot zu machen? (Hinweis: Nicht Selen RC)
Antworten:
Ja, es ist möglich. Das folgende Beispiel ist in 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"));
/tmp
, sich in einem eigenen Dateisystem zu befinden, und FirefoxDriver schreibt Screenshots in /tmp
.
HtmlUnitDriver
nicht implementiert TakesScreenshot
(siehe selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/... für eine Liste der unterstützten Treiber). Sie können aber als HTML speichern.
org.apache.commons.io.FileUtils
Jeder WebDriver verfügt über eine .save_screenshot(filename)
Methode. Für Firefox kann es also folgendermaßen verwendet werden:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.google.com/')
browser.save_screenshot('screenie.png')
Verwirrenderweise gibt es auch eine .get_screenshot_as_file(filename)
Methode, die dasselbe tut.
Es gibt auch Methoden für: .get_screenshot_as_base64()
(zum Einbetten in HTML) und .get_screenshot_as_png()
(zum Abrufen von Binärdaten).
und Beachten Sie, dass WebElements über eine .screenshot()
Methode verfügen , die ähnlich funktioniert, jedoch nur das ausgewählte Element erfasst.
driver.set_window_size(1366, 728)
.
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;
}
}
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);
});
});
var1
wenn Sie möchten. Sie sollten sich die takeScreenshot()
Funktion ansehen, um zu wissen, was genau sie ist. Möglicherweise ein Binärbild, das aus Javascript mit Leinwand gerendert wurde. Es kann der Dom sein, bevor er gerendert wird. Einblick in.
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :ie
driver.get "https://www.google.com"
driver.save_screenshot("./screen.png")
Weitere Dateitypen und Optionen sind verfügbar und Sie können sie in take_screenshot.rb sehen
headless
undFirefox
Ich habe dieses Problem behoben. Sie können das erweitern RemoteWebDriver
, um ihm alle Schnittstellen zu geben, die der Proxy-Treiber implementiert:
WebDriver augmentedDriver = new Augmenter().augment(driver);
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
Verwendet die PHPUnit_Selenium-Erweiterung Version 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');
}
...
}
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);
}
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;
}
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"))
Ich habe diese Methode verwendet, um einen Screenshot zu machen.
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();
}
}
Sie können diese Methode verwenden, wo immer dies erforderlich ist.
Scheint hier zu fehlen - Screenshot eines bestimmten Elements in Java machen:
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);
}
code
this.driver.manage (). Window (). SetSize (neue Dimension (1680, 1050)); oder um nicht benötigte Elemente über CSS zu entfernen. Die richtige Lösung wäre, den y-Versatz vom Scrollen zu berechnen.
Firefox
funktioniert einwandfrei, da der Elementbildschirm basierend auf den Abmessungen aus dem Vollbild ausgeschnitten wird. In Chrome
wenn das Element im Hinblick Teil vorhanden ist mit aus dem aus dieser Sicht Teil Bild Scrollen fängt es Element in Ordnung. Wenn wir einen Screenshot machen möchten, nachdem Sie document.documentElement.clientHeight
zweimal durch die Client-Höhe gescrollt haben, verwenden Sie diese Option (location.y)-2*clientHeight
, um einen genauen Element-Screenshot zu erhalten. Vielen Dank für diesen Beitrag, wie es mir hilft ...
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();
}
}
}
Benötigt NuGetPackages:
Getestet mit .NETFramework v4.5.2
Ich konnte die akzeptierte Antwort nicht zum Laufen bringen, aber gemäß der aktuellen WebDriver-Dokumentation funktionierte Folgendes mit Java 7 unter OS X 10.9 einwandfrei:
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);
}
}
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
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
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));
}
}
takescreenshot
Funktion aufgerufen wird? Woher kommt die $event
Variable? Ich bin ein kompletter Selenium-Neuling, daher wäre eine Antwort auf diese Frage, die keine Selenium-Vorkenntnisse voraussetzt, sehr willkommen!
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)
Andere Fahrer ...
$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
[OpenQA.Selenium.ScreenshotImageFormat]::Png
als System.Drawing
Namespace.
Python - Screenshot von Element:
Dies ist eine ziemlich alte Frage und hat mehrere Antworten. Es scheint jedoch, dass hier ein Screenshot eines bestimmten Webelements mit Python fehlt.
Standort
Ein Webelement hat seine eigene Position auf der Seite und wird im Allgemeinen in x- und y-Pixeln gemessen und als (x, y) -Koordinaten des Elements bezeichnet. Das Standortobjekt enthält zwei Werte.
Größe
Wie der Standort hat jedes WebElement Breite und Höhe. Verfügbar als Größenobjekt.
Mit (x, y) -Koordinaten und Werten für Breite und Höhe können wir das Bild zuschneiden und in einer Datei speichern.
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')
Hinweis: Entnommen aus http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/
Es gibt mehrere Methoden durch Selen's Java und PythonClient, um einen Screenshot zu machen mit zu machenSelen-Web-Treiber
Im Folgenden sind die verschiedenen Java- Methoden aufgeführt, um einen Screenshot zu erstellen :
Verwenden getScreenshotAs()
der TakesScreenshot-Oberfläche :
Codeblock:
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();
}
}
Bildschirmfoto:
Wenn die Webseite ist jquery aktiviert Sie verwenden können ,ein Schussaus der pazone / ashot Bibliothek:
Codeblock:
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();
}
}
Bildschirmfoto:
Verwenden von Selen-Shutterbugaus der Behauptung, dass / Selen-Shutterbug- Bibliothek:
Codeblock:
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();
}
}
Bildschirmfoto:
Im Folgenden finden Sie die verschiedenen Python- Methoden, um einen Screenshot zu erstellen :
Mit save_screenshot()
Methode:
Codeblock:
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()
Bildschirmfoto:
Mit get_screenshot_as_file()
Methode:
Codeblock:
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()
Bildschirmfoto:
Mit get_screenshot_as_png()
Methode:
Codeblock:
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()
Bildschirmfoto:
Sie können das Bild aus Windows mit dem Python-Webtreiber aufnehmen. Verwenden Sie den Code unter der Seite, auf der der Screenshot aufgenommen werden soll
driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
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;
}
Mit diesen beiden Methoden können Sie auch einen Screenshot mit Datum und Uhrzeit erstellen.
Mit RemoteWebDriver würde ich den Screenshot nach dem Erweitern des Knotens mit Screenshot-Funktionen folgendermaßen speichern:
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();
}
}
Sie können diese Methode verwenden, wo immer dies erforderlich ist. Dann gehe ich davon aus, dass Sie das Stylesheet des Maven-Surefire-Report-Plugins unter Surefire-Reports / html / custom.css so anpassen können, dass Ihre Berichte den Link zum richtigen Screenshot für jeden Test enthalten.
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));
Hoffe das löst dein Problem
C #
Sie können das folgende Code-Snippet / die folgende Funktion verwenden, um einen Screenshot mit dem Selen zu erstellen:
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);
}
Sie können die AShot-API ausprobieren. Hier ist der Github-Link für das gleiche.
https://github.com/yandex-qatools/ashot
Einige der Tests hier ...
JAVA
Methode zum Erfassen eines Screenshots für die Fehler in Selen mit angehängtem Testname und Zeitstempel.
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();
}
}
public static void ClickButton()
{
try
{
// code
}
catch (Exception e)
{
TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true);
Report.Screenshot();
throw (e);
}
}