Có ai biết nếu có thể chụp ảnh màn hình bằng Selenium WebDriver không? (Lưu ý: Không phải Selen RC)
Có ai biết nếu có thể chụp ảnh màn hình bằng Selenium WebDriver không? (Lưu ý: Không phải Selen RC)
Câu trả lời:
Vâng, nó là có thể. Ví dụ sau đây là trong 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
là trên hệ thống tệp của chính nó và FirefoxDriver viết ảnh chụp màn hình /tmp
.
HtmlUnitDriver
không triển khai TakesScreenshot
(xem selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/ trộm để biết danh sách các trình điều khiển được hỗ trợ). Nhưng bạn có thể lưu dưới dạng HTML.
org.apache.commons.io.FileUtils
Mỗi WebDriver có một .save_screenshot(filename)
phương thức. Vì vậy, đối với Firefox, nó có thể được sử dụng như thế này:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.google.com/')
browser.save_screenshot('screenie.png')
Một cách khó hiểu, một .get_screenshot_as_file(filename)
phương pháp cũng tồn tại mà làm điều tương tự.
Ngoài ra còn có các phương thức: .get_screenshot_as_base64()
(để nhúng vào html) và .get_screenshot_as_png()
(để lấy dữ liệu nhị phân).
và Lưu ý rằng WebElements có một .screenshot()
phương thức hoạt động tương tự, nhưng chỉ nắm bắt phần tử được chọn.
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
nếu bạn muốn. Bạn nên nhìn vào takeScreenshot()
chức năng để biết chính xác nó là gì. Có thể một hình ảnh nhị phân được kết xuất từ javascript bằng canvas. Nó có thể là dom, trước khi nó được kết xuất. Nhìn vào.
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :ie
driver.get "https://www.google.com"
driver.save_screenshot("./screen.png")
nhiều loại tệp và tùy chọn có sẵn và bạn có thể thấy chúng trong takes_sc Muff.rb
headless
vàFirefox
Tôi đã giải quyết vấn đề này. Bạn có thể gia tăng RemoteWebDriver
để cung cấp cho nó tất cả các giao diện mà trình điều khiển được ủy quyền của nó thực hiện:
WebDriver augmentedDriver = new Augmenter().augment(driver);
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
Sử dụng PHPUnit_Selenium phiên bản mở rộng 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"))
Tôi đã sử dụng phương pháp này để chụp ảnh màn hình.
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();
}
}
Bạn có thể sử dụng phương pháp này bất cứ nơi nào cần thiết.
Có vẻ như bị thiếu ở đây - chụp ảnh màn hình của một yếu tố cụ thể trong 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);
}
code
this.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); hoặc để loại bỏ bất kỳ yếu tố không cần thiết thông qua css. Giải pháp thích hợp sẽ là tính toán phần bù y từ cuộn.
Firefox
hoạt động tốt khi nó cắt màn hình thành phần từ Hình ảnh đầy đủ dựa trên Kích thước. Trong Chrome
trường hợp phần tử có sẵn trong phần xem mà không cuộn hình ảnh từ phần xem đó, phần tử sẽ chụp phần tử tốt. Nếu chúng tôi muốn chụp ảnh màn hình sau khi cuộn document.documentElement.clientHeight
hai lần Chiều cao của khách hàng, hãy sử dụng (location.y)-2*clientHeight
để có được ảnh chụp màn hình phần tử chính xác. Cảm ơn vì bài đăng này vì nó giúp tôi ...
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();
}
}
}
Yêu cầu NuGetPackages:
Đã thử nghiệm với .NETFramework v4.5.2
Tôi không thể nhận được câu trả lời được chấp nhận để làm việc, nhưng theo tài liệu WebDriver hiện tại , phần sau đây hoạt động tốt với tôi với Java 7 trên 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);
}
}
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
hàm này không? Cụ thể $event
biến đến từ đâu? Tôi là một Selenium noob hoàn chỉnh nên một câu trả lời cho câu hỏi này không cho rằng kiến thức về Selen trước đó sẽ được đánh giá rất cao!
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)
Trình điều khiển khác ...
$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
hơn System.Drawing
không gian tên.
Python - Ảnh chụp màn hình của Element:
Đây là một câu hỏi khá cũ và có nhiều câu trả lời. Tuy nhiên, dường như việc chụp ảnh màn hình của một thành phần web cụ thể bằng Python bị thiếu ở đây.
vị trí
Một phần tử web có vị trí riêng của nó trên trang và nói chung, nó được đo bằng pixel x và y và được gọi là (x, y) tọa độ của phần tử. Và đối tượng vị trí chứa hai giá trị.
kích thước
Giống như vị trí, mỗi WebEuity có chiều rộng và chiều cao; Có sẵn như đối tượng kích thước.
Sử dụng (x, y) tọa độ và chiều rộng, giá trị chiều cao, chúng ta có thể cắt hình ảnh và lưu trữ nó trong một tệp.
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')
Lưu ý: Lấy từ http://allselenium.info/capture-sccam-element-USE-python-selenium-webdo/
Có nhiều phương pháp thông qua Selen'S java và trănkhách hàng chụp ảnh màn hình bằngselenium-webdo
Sau đây là các phương thức Java khác nhau để chụp ảnh màn hình :
Sử dụng getScreenshotAs()
từ Giao diện TakesSc mãi :
Khối mã:
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();
}
}
Ảnh chụp màn hình:
Nếu trang web là jquery cho phép bạn có thể sử dụngashottừ thư viện pazone / ashot :
Khối mã:
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();
}
}
Ảnh chụp màn hình:
Sử dụng selenium-màn trậptừ thư viện assertthat / selenium-màn trập :
Khối mã:
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();
}
}
Ảnh chụp màn hình:
Sau đây là các phương thức Python khác nhau để chụp ảnh màn hình :
Sử dụng save_screenshot()
phương pháp:
Khối mã:
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()
Ảnh chụp màn hình:
Sử dụng get_screenshot_as_file()
phương pháp:
Khối mã:
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()
Ảnh chụp màn hình:
Sử dụng get_screenshot_as_png()
phương pháp:
Khối mã:
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()
Ảnh chụp màn hình:
Bạn có thể chụp ảnh từ windows bằng trình điều khiển web python. Sử dụng mã bên dưới trang nào cần chụp ảnh màn hình
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;
}
Sử dụng hai phương pháp này, bạn cũng có thể chụp ảnh màn hình theo ngày và giờ.
Sử dụng RemoteWebDriver, sau khi tăng cường Node với khả năng chụp màn hình, tôi sẽ lưu trữ ảnh chụp màn hình như sau:
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();
}
}
Bạn có thể sử dụng phương pháp này bất cứ nơi nào cần thiết. Sau đó, tôi giả sử bạn có thể tùy chỉnh biểu định kiểu của maven-Surefire-báo cáo-plugin tại Surefire-báo cáo / html / custom.css để báo cáo của bạn bao gồm liên kết đến ảnh chụp màn hình chính xác cho mỗi bài kiểm tra?
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));
Hy vọng điều này sẽ giải quyết vấn đề của bạn
C #
Bạn có thể sử dụng đoạn mã / chức năng sau đây để chụp ảnh màn hình với selenium:
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);
}
Bạn có thể thử dùng AShot API. Đây là liên kết github cho cùng.
https://github.com/yandex-qatools/ashot
Một số bài kiểm tra ở đây ...
JAVA
Phương pháp để chụp ảnh màn hình cho các lỗi trong Selenium với TestName và Dấu thời gian được nối thêm.
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);
}
}