Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium web元素 datatowrite=imagepanel.screenshot\u as\u png #将字节数据写入文件 outfile=open(“imagepanel.png”、“wb”) outfile.write(datatowrite) outfile.close()_Selenium_Selenium Webdriver_Screenshot - Fatal编程技术网

Selenium web元素 datatowrite=imagepanel.screenshot\u as\u png #将字节数据写入文件 outfile=open(“imagepanel.png”、“wb”) outfile.write(datatowrite) outfile.close()

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

(使用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();
        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();
   }
}