Wie kann ich mit Selenium Webdriver den Screenshot eines bestimmten Elements und nicht die gesamte Seite erfassen?

83

Derzeit versuche ich, einen Screenshot mit dem Selenium WebDriver aufzunehmen. Ich kann aber nur den Screenshot der gesamten Seite erhalten. Ich wollte jedoch nur einen Teil der Seite oder vielleicht nur ein bestimmtes Element basierend auf der ID oder einem bestimmten Element-Locator erfassen. (Zum Beispiel möchte ich das Bild mit der Bild-ID = "Schmetterling" aufnehmen.)

Gibt es eine Möglichkeit, einen Screenshot nach ausgewählten Elementen oder Elementen aufzunehmen?

fj123
quelle
1
AFAIK, die Möglichkeit besteht nur darin, die gesamte Seite zu erfassen. Wir haben keine Screenshot-Funktion, die die Element-ID oder den Namen als Eingabe verwendet.
Hemanth
Jeder könnte mir sagen, wie lautet der Methodenaufruf für BUfferedImage in c #? Ich konnte keine ähnliche Methode finden.
fj123

Antworten:

117

Wir können den Element-Screenshot erhalten, indem wir den Screenshot der gesamten Seite wie folgt zuschneiden:

driver.get("http://www.google.com");
WebElement ele = driver.findElement(By.id("hplogo"));

// 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(), point.getY(),
    eleWidth, eleHeight);
ImageIO.write(eleScreenshot, "png", screenshot);

// Copy the element screenshot to disk
File screenshotLocation = new File("C:\\images\\GoogleLogo_screenshot.png");
FileUtils.copyFile(screenshot, screenshotLocation);
Surya
quelle
Danke für deine Antwort. Warum unterscheidet sich mein Webdriver jedoch von Ihrem? Es verwendet IWebDriver, ITakeScreenshot und es gibt keine OutputType.FILE und BufferedImage ... verwende ich die veraltete Version von Webdriver Selen?
fj123
Verwenden Sie die C # Webdriver-Bindung?
Surya
Ja, ich denke schon. Zuvor habe ich RC verwendet und in letzter Zeit habe ich nur den Webtreiber verwendet.
fj123
Diese Implementierung ist für die Java-Bindung vorgesehen. Dieses Konzept sollte auch für C # funktionieren. Aber ich bin mir der C # -Sprache nicht sehr bewusst. Sie müssen C # -äquivalente Bibliotheken verwenden (BufferedImage, ImageIO ...)
Surya
4
Der obige Code funktioniert in Chrome nicht. Eine Ausnahme java.awt.image.RasterFormatException: (y + height) außerhalb von Raster wurde in der Zeile BufferedImage eleScreenshot = fullImg.getSubimage (point.getX (), point.getY (), eleWidth, eleHeight) ausgelöst.
Ripon Al Wasim
14

Hier ist eine Python 3-Version mit Selenium Webdriver und Pillow. Dieses Programm erfasst den Screenshot der gesamten Seite und schneidet das Element basierend auf seiner Position zu. Das Element image wird als image.png verfügbar sein. Firefox unterstützt das direkte Speichern von Elementbildern mit element.screenshot_as_png ('image_name').

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')

Aktualisieren

Jetzt unterstützt Chrome auch Screenshots einzelner Elemente. So können Sie den Screenshot des Webelements wie unten angegeben direkt aufnehmen.

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")
Codeslord
quelle
4
Ich bin mir ziemlich sicher, dass dies element.sizein Punkten angegeben ist, während der von erstellte Screenshot driver.save_screenshotAbmessungen von Pixeln hat. Wenn Ihr Bildschirm hat eine Pixel-zu-Punkt - Verhältnis ungleich 1 (zB Retina MacBooks haben zwei Pixel pro Punkt - ein Verhältnis von 2) , dann müssen Sie multiplizieren wund hvon diesem Verhältnis.
BallpointBen
Neue Version konnte element.screenshot ('elemenent.png') verwenden, siehe die Antwort von @ rovr138
tinyhare
@tinyhare Es war nur in Firefox verfügbar, als die Antwort erstellt wurde. Ich denke, es ist jetzt auch in Chrom erhältlich. Antwort aktualisieren.
Codeslord
1
@puppet Zum Laden im Speicher tun Sie dies. from StringIO import StringIO; from PIL import Image; img = Image.open(StringIO(image))
Codeslord
1
Ich hatte ein ähnliches Problem wie @puppet. Dies ist, was für mich funktioniert hat: import io; from PIL import Image; img = Image.open(io.BytesIO(image)); img.save("image.png")
Somto Muotoe
9

In habe Node.jsich den folgenden Code geschrieben, der funktioniert, aber nicht auf dem offiziellen WebDriverJS von Selen basiert, sondern auf SauceLabs's WebDriver: WD.js und einer sehr kompakten Bildbibliothek namens EasyImage .

Ich möchte nur betonen, dass Sie den Screenshot eines Elements nicht wirklich machen können, aber Sie sollten zuerst den Screenshot der gesamten Seite machen, dann den Teil der Seite auswählen, den Sie mögen, und diesen bestimmten Teil zuschneiden:

browser.get(URL_TO_VISIT)
       .waitForElementById(dependentElementId, webdriver.asserters.isDisplayed, 3000)
       .elementById(elementID)
        .getSize().then(function(size) {
            browser.elementById(elementID)
                   .getLocation().then(function(location) {
                        browser.takeScreenshot().then(function(data) {
                            var base64Data = data.replace(/^data:image\/png;base64,/, "");
                            fs.writeFile(filePath, base64Data, 'base64', function(err) {
                                if (err) {
                                    console.log(err);
                                } 
                                else {
                                    cropInFile(size, location, filePath);
                                }
                                doneCallback();
                        });
                    });
                });
            }); 

Und die cropInFileFunction sieht folgendermaßen aus:

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;
        });
};
ambodi
quelle
Ihre EasyImage-Bibliothek ist kaputt: "ImageMagickMissingError"
Nizar B.
9

Das ASHOT-Framework von Yandex kann zum Erstellen von Screenshots in Selenium WebDriver-Skripten für verwendet werden

  • vollständige Webseiten
  • Webelemente

Dieses Framework finden Sie unter https://github.com/yandex-qatools/ashot .

Der Code zum Aufnehmen der Screenshots ist sehr einfach:

GESAMTE SEITE

screenshot = new AShot().shootingStrategy(
new ViewportPastingStrategy(1000)).takeScreenshot(driver);
ImageIO.write(screenshot.getImage(), "PNG", new File("c:\\temp\\results.png"));

SPEZIFISCHES WEBELEMENT

screenshot = new AShot().takeScreenshot(driver, 
driver.findElement(By.xpath("(//div[@id='ct_search'])[1]")));

ImageIO.write(screenshot.getImage(), "PNG", new File("c:\\temp\\div_element.png"));

Weitere Details und Codebeispiele finden Sie in diesem Artikel .

Alex Siminiuc
quelle
Seien Sie vorsichtig, wenn Sie auch den Modus benötigen, .shootingStrategy(ShootingStrategies.viewportPasting(100))da SPECIFIC WEB ELEMENTsonst möglicherweise nicht alle Elemente erfasst werden.
user1686407
8

Für alle, die in C # nach Code fragen, finden Sie unten eine vereinfachte Version meiner Implementierung.

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);
    }
}
Bach
quelle
Vielen Dank. Das war sehr hilfreich und war auf den Punkt und perfekt.
Sauerampfer Vesper
5

Ich habe viel Zeit damit verschwendet, einen Screenshot zu machen, und ich möchte Ihren speichern. Ich habe Chrom + Selen + C # verwendet. Das Ergebnis war total schrecklich. Endlich habe ich eine Funktion geschrieben:

driver.Manage().Window.Maximize();
             RemoteWebElement remElement = (RemoteWebElement)driver.FindElement(By.Id("submit-button")); 
             Point location = remElement.LocationOnScreenOnceScrolledIntoView;  

             int viewportWidth = Convert.ToInt32(((IJavaScriptExecutor)driver).ExecuteScript("return document.documentElement.clientWidth"));
             int viewportHeight = Convert.ToInt32(((IJavaScriptExecutor)driver).ExecuteScript("return document.documentElement.clientHeight"));

             driver.SwitchTo();

             int elementLocation_X = location.X;
             int elementLocation_Y = location.Y;

             IWebElement img = driver.FindElement(By.Id("submit-button"));

             int elementSize_Width = img.Size.Width;
             int elementSize_Height = img.Size.Height;

             Size s = new Size();
             s.Width = driver.Manage().Window.Size.Width;
             s.Height = driver.Manage().Window.Size.Height;

             Bitmap bitmap = new Bitmap(s.Width, s.Height);
             Graphics graphics = Graphics.FromImage(bitmap as Image);
             graphics.CopyFromScreen(0, 0, 0, 0, s);

             bitmap.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);

             RectangleF part = new RectangleF(elementLocation_X, elementLocation_Y + (s.Height - viewportHeight), elementSize_Width, elementSize_Height);

             Bitmap bmpobj = (Bitmap)Image.FromFile(filePath);
             Bitmap bn = bmpobj.Clone(part, bmpobj.PixelFormat);
             bn.Save(finalPictureFilePath, System.Drawing.Imaging.ImageFormat.Png); 
Rajendra_Prasad
quelle
1
Es funktioniert einwandfrei, solange Sie versuchen, ein Element zu erfassen, das ohne Scrollen sichtbar ist. Wenn Sie zu einem Element scrollen müssen, um es zu erfassen, wird der y-Versatz vom oberen Rand der Seite berechnet, der dann die Grenzen des Vollbilds überschreitet. Die einfachste Lösung besteht also darin, entweder den Bildschirmgrößencode this.driver.manage (). Window (). SetSize (neue Dimension (1680, 1050)) zu erhöhen; oder um nicht benötigte Elemente über CSS zu entfernen. Die richtige Lösung wäre, den y-Versatz vom Scrollen zu berechnen.
Ichwardort
3

Die Antwort von Surya funktioniert hervorragend, wenn es Ihnen nichts ausmacht, Festplatten-E / A zu verwenden. Wenn Sie es lieber nicht möchten, ist diese Methode möglicherweise besser für Sie

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

Wenn Sie es vorziehen, können Sie das Deklarieren überspringen screengrabund stattdessen tun

img = ImageIO.read(
    new ByteArrayInputStream(
        ((TakesScreenshot) d).getScreenshotAs(OutputType.BYTES)));

Das ist sauberer, aber ich habe es der Klarheit halber belassen. Sie können es dann als Datei speichern oder nach Herzenslust in ein JPanel einfügen .

rath
quelle
3

Python 3

Versucht mit Selen 3.141.0 und Chromedriver 73.0.3683.68, funktioniert dies,

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')

Es ist nicht erforderlich, ein Vollbild und einen Abschnitt eines Vollbilds zu erhalten.

Dies war möglicherweise nicht verfügbar, als Rohits Antwort erstellt wurde.

rovr138
quelle
2
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();
        }
    }
Waqar Ullah Khan
quelle
2

Wenn Sie nach einer JavaScript-Lösung suchen, ist hier mein Kern:

https://gist.github.com/sillicon/4abcd9079a7d29cbb53ebee547b55fba

Die Grundidee ist dieselbe: Machen Sie zuerst den Screenshot und schneiden Sie ihn dann zu. Für meine Lösung sind jedoch keine anderen Bibliotheken erforderlich, sondern nur reiner WebDriver-API-Code. Der Nebeneffekt ist jedoch, dass dies die Auslastung Ihres Testbrowsers erhöhen kann.

Sillicon
quelle
Bitte fügen Sie den Code in Ihre Antwort ein, anstatt auf eine andere Quelle zu
verlinken
2

Hier ist eine Erweiterungsfunktion für C #:

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

Jetzt können Sie damit das Bild eines Elements wie dieses aufnehmen:

var image = webDriver.GetElementImage(By.Id("someId"));
Hüseyin Yağlı
quelle
1

Erwägen Sie die Verwendung des Nadel-Tools für den automatisierten visuellen Vergleich https://github.com/bfirsh/needle , das über eine integrierte Funktionalität verfügt, mit der Screenshots bestimmter Elemente (ausgewählt durch den CSS-Selektor) erstellt werden können. Das Tool funktioniert auf Seleniums WebDriver und ist in Python geschrieben.

Jan Rozycki
quelle
1

Unterhalb der Funktion zum Aufnehmen eines Schnappschusses eines bestimmten Elements in Selen. Hier ist der Treiber eine Art WebDriver.

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);
 }
ER.swatantra
quelle
Weitere
Informationen finden
1

c # Code:

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;
}
Andrew
quelle
0
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);                        
            }
        }
    }
}
Mnemo
quelle
0

Wenn Sie eine Ausnahme java.awt.image.RasterFormatException in Chrome erhalten oder ein Element in die Ansicht scrollen möchten, erfassen Sie einen Screenshot.

Hier ist eine Lösung von @Surya Antwort.

        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);
Grüne Lei
quelle
Ich verwende Selenium-Java-2.53.1, kompiliere Gruppe: 'org.seleniumhq.selenium', Name: 'Selenium-Java', Version: '2.53.1', Chrome-Web-Treiber, ich versuche By zu beschneiden .xpath (".// img [@class = 'captcha']") von der Webseite resident.uidai.gov.in/offlineaadhaar , aber Ihr Code funktioniert nicht richtig. Es schneidet einen falschen Teil der Seite ab. Kannst du mir bitte helfen, das Captcha zu beschneiden?
Vijay
0

Dies ist meine Version, in C # habe ich im Grunde den größten Teil von Brooks Antwort erhalten und sie an meinen Zweck angepasst

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[]));
        }
    }
Hoang Minh
quelle
-1

Ich glaube, dass dies bei Ihnen nicht funktionieren wird, da Sie C # verwenden und meine Lösung eine Java-Bibliothek enthält. Vielleicht finden es andere jedoch hilfreich.

Zum Aufnehmen von benutzerdefinierten Screenshots können Sie die Shutterbug-Bibliothek verwenden. Der spezifische Aufruf für diesen Zweck wäre:

Shutterbug.shootElement(driver, element).save();
Marlies
quelle
-1

Ich habe den Beispielcode von @codeslord befolgt, musste aber aus irgendeinem Grund anders auf meine Screenshot-Daten zugreifen:

 # Open the Firefox webdriver
 driver = webdriver.Firefox()
 # Find the element that you're interested in
 imagepanel = driver.find_element_by_class_name("panel-height-helper")
 # Access the data bytes for the web element
 datatowrite = imagepanel.screenshot_as_png
 # Write the byte data to a file
 outfile = open("imagepanel.png", "wb")
 outfile.write(datatowrite)
 outfile.close()

(mit Python 3.7, Selenium 3.141.0 und Mozilla Geckodriver 71.0.0.7222)

Rishi Latchmepersad
quelle
-2

Ich verwende eine modifizierte Version von @ Brooks Antwort und funktioniert auch für Elemente, bei denen die Seite gescrollt werden muss, einwandfrei.

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

Die beiden ifs waren notwendig (zumindest für den Chrome-Treiber), da die Größe des Zuschnitts beim Scrollen 1 Pixel über der Screenshot-Größe lag.

thepirat000
quelle
Ich erhalte diese Fehlermeldung, wenn ich Ihre Methode ausprobiere: Transparenter Proxy kann nicht in den Typ 'OpenQA.Selenium.Remote.RemoteWebElement' umgewandelt werden
Shanabus
Ich verwende dies ausschließlich mit Chrome Driver. Welchen Treiber verwenden Sie?
Thepirat000
Ich benutze auch ChromeDriver. Meine Tests verwenden IWebElements und wir folgen der PageFactory-Methode aus dem OpenQA.Selenium.Support-Nuget-Paket.
Shanabus