Selenium web元素 datatowrite=imagepanel.screenshot\u as\u png #将字节数据写入文件 outfile=open(“imagepanel.png”、“wb”) outfile.write(datatowrite) outfile.close()
(使用Python 3.7、Selenium 3.141.0和Mozilla Geckodriver 71.0.0.7222)这是我的版本,在C#中,我基本上从Brook的答案中得到了大部分内容,并根据我的目的对其进行了修改Selenium web元素 datatowrite=imagepanel.screenshot\u as\u png #将字节数据写入文件 outfile=open(“imagepanel.png”、“wb”) outfile.write(datatowrite) outfile.close(),selenium,selenium-webdriver,screenshot,Selenium,Selenium Webdriver,Screenshot,(使用Python 3.7、Selenium 3.141.0和Mozilla Geckodriver 71.0.0.7222)这是我的版本,在C#中,我基本上从Brook的答案中得到了大部分内容,并根据我的目的对其进行了修改 public static byte[] GetElementImage(this IWebElement element) { var screenShot = MobileDriver.Driver.GetScreenshot();
public static byte[] GetElementImage(this IWebElement element)
{
var screenShot = MobileDriver.Driver.GetScreenshot();
using (var stream = new MemoryStream(screenShot.AsByteArray))
{
var screenBitmap = new Bitmap(stream);
var elementBitmap = screenBitmap.Clone(
new Rectangle(
element.Location.X,
element.Location.Y,
element.Size.Width,
element.Size.Height
),
screenBitmap.PixelFormat
);
var converter = new ImageConverter();
return (byte[]) converter.ConvertTo(elementBitmap, typeof(byte[]));
}
}
我认为这里的大多数答案都设计过度了。我这样做的方式是通过2个helper方法,第一个是等待基于任何选择器的元素;第二个是截图 注意:我们将
WebElement
强制转换为TakesScreenshot
实例,因此我们仅在图像中捕获该元素。如果你想要完整的页面/窗口,你应该改为播放driver
WebDriver-driver=newfirefoxdriver();//在某处(或chrome等)定义此项
公共T屏幕快照(按、长超时、输出类型){
return((TakesScreenshot)waitForElement(by,timeout))
.getScreenshotAs(类型);
}
公共WebElement waitForElement(按,长超时){
返回新的WebDriverWait(驱动程序,超时)
.直到(驱动程序->驱动程序findElement(by));
}
然后只需截图,你想要什么,就像这样:
long timeout=5;//几秒钟内
/*基于标记首次出现的屏幕截图(到文件)*/
文件sc=屏幕快照(按.tagName(“body”)、超时、输出类型.File);
/*基于CSS选择器的屏幕截图(内存中)(例如,正文中的第一个图像
谁的“src”属性以“https”开头)*/
byte[]sc=screenshotOf(By.cssSelector(“body>img[href^='https']),超时,OutputType.BYTES);
要拍摄特定元素的屏幕截图,您现在可以使用以下内容:
public void takeCanvasScreenshot(WebElement element, String imageName) {
File screenshot = element.getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenshot, new File("src/main/resources/screenshots/" + imageName + ".png"));
} catch (IOException e) {
e.printStackTrace();
}
}
好了,这个工具只是用来捕获整个页面的。我们没有以元素id或名称作为输入的屏幕截图函数。任何人都可以告诉我c#中BuffereImage的方法调用是什么?我找不到与此相关的任何类似方法。谢谢您的回复。但是,为什么我的webdriver与您的不同。它使用IWebDriver,ITakeScreenshot,并且没有OutputType.FILE和BuffereImage。。。我使用的是过时版本的webdriver selenium吗?你使用的是C#webdriver绑定吗?是的,我想是这样。以前我使用的是RC,最近我改为使用web驱动程序。这个实现是针对Java绑定的。这一概念也适用于C#。但我对C语言知之甚少。您需要使用C#等效库(BuffereImage、ImageIO…),上面的代码在Chrome中不起作用。在行BuffereImage eleScreenshot=fullImg.getSubimage(point.getX(),point.getY(),eleWidth,eleHeight)处引发了一个异常java.awt.image.RasterFormatException:(y+高度)在光栅之外;只要您尝试捕获一个无需滚动即可看到的元素,它就可以正常工作。当需要滚动到某个元素以捕获该元素时,将从页面顶部计算y偏移量,该偏移量将超过全屏图像的边界。因此,最简单的解决方案是增加屏幕大小代码this.driver.manage().window().setSize(新维度(16801050));或者通过css删除任何不需要的元素。正确的解决方案是计算滚动的y偏移量。谢谢。这是非常有用的,并且是切中要害和完美的。当我尝试你的方法时,我得到了这个错误:无法将透明代理转换为“OpenQA.Selenium.Remote.RemoteWebElement”类型。我专门使用Chrome驱动程序,你使用哪个驱动程序?我也使用ChromeDriver。我的测试使用的是IWebElements,我们遵循OpenQA.Selenium.Support nuget包中的PageFactory方法。有关更多信息,请参阅此链接:[自动化中心点]()小心,您可能还需要
。shootingStrategy(ShootingStrategies.viewportPasting(100))
特定的WEB元素模式,或者它可能无法捕获所有元素。我正在使用selenium-java-2.53.1,编译组:'org.seleniumhq.selenium',名称:'selenium java',版本:'2.53.1',chrome web驱动程序,我正在尝试从网页中通过.xpath(.//img[@class='captcha'])进行裁剪,但您的代码工作不正常。它裁剪了页面的一些错误部分。你能帮我裁剪一下验证码吗?我很确定元素.size
是以点为单位给出的,而驱动程序.save\u截图的尺寸是像素。如果您的屏幕的像素点比不是1(例如,retina MacBooks的每个点有两个像素——比率为2),则需要将w
和h
乘以该比率。新版本已经能够使用element.screenshot('elemenent.png'),看到答案了吗@rovr138@tinyhare它只有在Firefox中创建答案时才可用。我认为它现在也可以在chrome中使用。正在更新内存加载的答案,请执行此操作<代码>从StringIO导入StringIO;从PIL导入图像;img=Image.open(StringIO(Image))
我遇到了与@puppet类似的问题。这就是我的工作:importio;从PIL导入图像;img=Image.open(io.BytesIO(Image));img.save(“image.png”)
请将代码粘贴到您的答案中,而不是链接到其他来源您的EasyImage库已损坏:“ImageMagickMissingError”
var cropInFile = function(size, location, srcFile) {
easyimg.crop({
src: srcFile,
dst: srcFile,
cropwidth: size.width,
cropheight: size.height,
x: location.x,
y: location.y,
gravity: 'North-West'
},
function(err, stdout, stderr) {
if (err) throw err;
});
};
private Image getScreenshot(final WebDriver d, final WebElement e) throws IOException {
final BufferedImage img;
final Point topleft;
final Point bottomright;
final byte[] screengrab;
screengrab = ((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES);
img = ImageIO.read(new ByteArrayInputStream(screengrab));
//crop the image to focus on e
//get dimensions (crop points)
topleft = e.getLocation();
bottomright = new Point(e.getSize().getWidth(),
e.getSize().getHeight());
return img.getSubimage(topleft.getX(),
topleft.getY(),
bottomright.getX(),
bottomright.getY());
}
img = ImageIO.read(
new ByteArrayInputStream(
((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES)));
public void GenerateSnapshot(string url, string selector, string filePath)
{
using (IWebDriver driver = new ChromeDriver())
{
driver.Navigate().GoToUrl(url);
var remElement = driver.FindElement(By.CssSelector(selector));
Point location = remElement.Location;
var screenshot = (driver as ChromeDriver).GetScreenshot();
using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray))
{
using (Bitmap bitmap = new Bitmap(stream))
{
RectangleF part = new RectangleF(location.X, location.Y, remElement.Size.Width, remElement.Size.Height);
using (Bitmap bn = bitmap.Clone(part, bitmap.PixelFormat))
{
bn.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
}
}
}
driver.Close();
}
}
public static void TakeScreenshot(IWebDriver driver, IWebElement element)
{
try
{
string fileName = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".jpg";
Byte[] byteArray = ((ITakesScreenshot)driver).GetScreenshot().AsByteArray;
System.Drawing.Bitmap screenshot = new System.Drawing.Bitmap(new System.IO.MemoryStream(byteArray));
System.Drawing.Rectangle croppedImage = new System.Drawing.Rectangle(element.Location.X, element.Location.Y, element.Size.Width, element.Size.Height);
screenshot = screenshot.Clone(croppedImage, screenshot.PixelFormat);
screenshot.Save(String.Format(@"C:\SeleniumScreenshots\" + fileName, System.Drawing.Imaging.ImageFormat.Jpeg));
}
catch (Exception e)
{
logger.Error(e.StackTrace + ' ' + e.Message);
}
}
public void TakeScreenshot(string fileNameWithoutExtension, IWebElement element)
{
// Scroll to the element if necessary
var actions = new Actions(_driver);
actions.MoveToElement(element);
actions.Perform();
// Get the element position (scroll-aware)
var locationWhenScrolled = ((RemoteWebElement) element).LocationOnScreenOnceScrolledIntoView;
var fileName = fileNameWithoutExtension + ".png";
var byteArray = ((ITakesScreenshot) _driver).GetScreenshot().AsByteArray;
using (var screenshot = new System.Drawing.Bitmap(new System.IO.MemoryStream(byteArray)))
{
var location = locationWhenScrolled;
// Fix location if necessary to avoid OutOfMemory Exception
if (location.X + element.Size.Width > screenshot.Width)
{
location.X = screenshot.Width - element.Size.Width;
}
if (location.Y + element.Size.Height > screenshot.Height)
{
location.Y = screenshot.Height - element.Size.Height;
}
// Crop the screenshot
var croppedImage = new System.Drawing.Rectangle(location.X, location.Y, element.Size.Width, element.Size.Height);
using (var clone = screenshot.Clone(croppedImage, screenshot.PixelFormat))
{
clone.Save(fileName, ImageFormat.Png);
}
}
}
using System.Drawing;
using System.Drawing.Imaging;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
public void ScreenshotByElement()
{
IWebDriver driver = new FirefoxDriver();
String baseURL = "www.google.com/"; //url link
String filePath = @"c:\\img1.png";
driver.Navigate().GoToUrl(baseURL);
var remElement = driver.FindElement(By.Id("Butterfly"));
Point location = remElement.Location;
var screenshot = (driver as FirefoxDriver).GetScreenshot();
using (MemoryStream stream = new MemoryStream(screenshot.AsByteArray))
{
using (Bitmap bitmap = new Bitmap(stream))
{
RectangleF part = new RectangleF(location.X, location.Y, remElement.Size.Width, remElement.Size.Height);
using (Bitmap bn = bitmap.Clone(part, bitmap.PixelFormat))
{
bn.Save(filePath, ImageFormat.Png);
}
}
}
}
Shutterbug.shootElement(driver, element).save();
private static void getScreenshot(final WebElement e, String fileName) throws IOException {
final BufferedImage img;
final Point topleft;
final Point bottomright;
final byte[] screengrab;
screengrab = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
img = ImageIO.read(new ByteArrayInputStream(screengrab));
topleft = e.getLocation();
bottomright = new Point(e.getSize().getWidth(), e.getSize().getHeight());
BufferedImage imgScreenshot=
(BufferedImage)img.getSubimage(topleft.getX(), topleft.getY(), bottomright.getX(), bottomright.getY());
File screenshotLocation = new File("Images/"+fileName +".png");
ImageIO.write(imgScreenshot, "png", screenshotLocation);
}
public static BitmapImage GetElementImage(this IWebDriver webDriver, By by)
{
var elements = webDriver.FindElements(by);
if (elements.Count == 0)
return null;
var element = elements[0];
var screenShot = (webDriver as ITakesScreenshot).GetScreenshot();
using (var ms = new MemoryStream(screenShot.AsByteArray))
{
Bitmap screenBitmap;
screenBitmap = new Bitmap(ms);
return screenBitmap.Clone(
new Rectangle(
element.Location.X,
element.Location.Y,
element.Size.Width,
element.Size.Height
),
screenBitmap.PixelFormat
).ToBitmapImage();
}
}
var image = webDriver.GetElementImage(By.Id("someId"));
from selenium import webdriver
from PIL import Image
driver = webdriver.Chrome()
driver.get('https://www.google.co.in')
element = driver.find_element_by_id("lst-ib")
location = element.location
size = element.size
driver.save_screenshot("shot.png")
x = location['x']
y = location['y']
w = size['width']
h = size['height']
width = x + w
height = y + h
im = Image.open('shot.png')
im = im.crop((int(x), int(y), int(width), int(height)))
im.save('image.png')
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.google.co.in')
image = driver.find_element_by_id("lst-ib").screenshot_as_png
# or
# element = driver.find_element_by_id("lst-ib")
# element.screenshot_as_png("image.png")
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
Long offsetTop = (Long) jsExecutor.executeScript("window.scroll(0, document.querySelector(\""+cssSelector+"\").offsetTop - 0); return document.querySelector(\""+cssSelector+"\").getBoundingClientRect().top;");
WebElement ele = driver.findElement(By.cssSelector(cssSelector));
// Get entire page screenshot
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
BufferedImage fullImg = ImageIO.read(screenshot);
// Get the location of element on the page
Point point = ele.getLocation();
// Get width and height of the element
int eleWidth = ele.getSize().getWidth();
int eleHeight = ele.getSize().getHeight();
// Crop the entire page screenshot to get only element screenshot
BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), Math.toIntExact(offsetTop),
eleWidth, eleHeight);
ImageIO.write(eleScreenshot, "png", screenshot);
// Copy the element screenshot to disk
File screenshotLocation = new File("c:\\temp\\div_element_1.png");
FileUtils.copyFile(screenshot, screenshotLocation);
public Bitmap MakeElemScreenshot( IWebDriver driver, WebElement elem)
{
Screenshot myScreenShot = ((ITakesScreenshot)driver).GetScreenshot();
Bitmap screen = new Bitmap(new MemoryStream(myScreenShot.AsByteArray));
Bitmap elemScreenshot = screen.Clone(new Rectangle(elem.Location, elem.Size), screen.PixelFormat);
screen.Dispose();
return elemScreenshot;
}
from selenium import webdriver
chromedriver = '/usr/local/bin/chromedriver'
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('window-size=1366x768')
chromeOptions.add_argument('disable-extensions')
cdriver = webdriver.Chrome(options=chromeOptions, executable_path=chromedriver)
cdriver.get('url')
element = cdriver.find_element_by_css_selector('.some-css.selector')
element.screenshot_as_png('elemenent.png')
public static byte[] GetElementImage(this IWebElement element)
{
var screenShot = MobileDriver.Driver.GetScreenshot();
using (var stream = new MemoryStream(screenShot.AsByteArray))
{
var screenBitmap = new Bitmap(stream);
var elementBitmap = screenBitmap.Clone(
new Rectangle(
element.Location.X,
element.Location.Y,
element.Size.Width,
element.Size.Height
),
screenBitmap.PixelFormat
);
var converter = new ImageConverter();
return (byte[]) converter.ConvertTo(elementBitmap, typeof(byte[]));
}
}
public void takeCanvasScreenshot(WebElement element, String imageName) {
File screenshot = element.getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(screenshot, new File("src/main/resources/screenshots/" + imageName + ".png"));
} catch (IOException e) {
e.printStackTrace();
}
}