Jak zrobić zrzut ekranu konkretnego elementu zamiast całej strony za pomocą Selenium Webdriver?

83

Obecnie próbuję zrobić zrzut ekranu za pomocą Selenium WebDriver. Ale mogę uzyskać tylko zrzut całego ekranu strony. Jednak chciałem po prostu uchwycić część strony lub tylko określony element na podstawie identyfikatora lub dowolnego określonego lokalizatora elementów. (Na przykład chcę zrobić zdjęcie z identyfikatorem obrazu = „Motyl”)

Czy istnieje sposób na przechwycenie zrzutu ekranu według wybranego elementu lub elementu?

fj123
źródło
1
AFAIK, funkcja służy tylko do przechwytywania całej strony. Nie mamy funkcji zrzutu ekranu, która pobiera identyfikator lub nazwę elementu jako dane wejściowe.
Hemanth
Każdy może mi powiedzieć, co to jest wywołanie metody dla BUfferedImage w C #? Nie mogłem znaleźć podobnej metody związanej z tym.
fj123

Odpowiedzi:

118

Możemy uzyskać zrzut ekranu elementu, przycinając zrzut całej strony, jak poniżej:

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
źródło
Dziękuję za odpowiedź. Jednak dlaczego mój webdriver różni się od twojego. używa IWebDriver, ITakeScreenshot i nie ma OutputType.FILE i BufferedImage ... czy używam przestarzałej wersji selenu webdriver?
fj123
Czy używasz wiązania webdriver C #?
Surya
Tak myślę. Wcześniej używałem RC i ostatnio zmieniłem na sterownik sieciowy.
fj123
Ta implementacja jest przeznaczona do wiązania języka Java. Ta koncepcja powinna działać również dla języka C #. Ale nie jestem zbyt świadomy języka C #. Musisz użyć równoważnych bibliotek C # (BufferedImage, ImageIO ...)
Surya
4
Powyższy kod nie działa w przeglądarce Chrome. Wyjątek java.awt.image.RasterFormatException: (y + wysokość) jest poza Rastrem został zgłoszony w wierszu BufferedImage eleScreenshot = fullImg.getSubimage (point.getX (), point.getY (), eleWidth, eleHeight);
Ripon Al Wasim
14

Oto wersja Pythona 3 wykorzystująca webdriver Selenium i Pillow. Ten program przechwytuje zrzut ekranu całej strony i przycina element na podstawie jego lokalizacji. Obraz elementu będzie dostępny jako image.png. Firefox obsługuje zapisywanie obrazu elementu bezpośrednio przy użyciu elementu element.screenshot_as_png ('nazwa_obrazu').

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

Aktualizacja

Teraz chrome obsługuje również zrzuty ekranu poszczególnych elementów. Możesz więc bezpośrednio przechwycić zrzut ekranu elementu internetowego, jak podano poniżej.

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")
codelord
źródło
4
Jestem prawie pewien, że element.sizejest to podane w punktach, podczas gdy zrzut ekranu utworzony przez driver.save_screenshotma wymiary pikseli. Jeśli twój ekran ma stosunek pikseli do punktu inny niż 1 (np. MacBooki Retina mają dwa piksele na punkt - stosunek 2), musisz pomnożyć wi hprzez ten współczynnik.
BallpointBen
nowa wersja mogła korzystać z elementu.screenshot ('elemenent.png'), zobacz odpowiedź @ rovr138
tinyhare
@tinyhare Było dostępne tylko w Firefoksie, gdy utworzono odpowiedź. Myślę, że teraz jest również dostępny w wersji chromowanej. Aktualizacja odpowiedzi.
codelord
1
@puppet Aby załadować pamięć, zrób to. from StringIO import StringIO; from PIL import Image; img = Image.open(StringIO(image))
codelord
1
Miałem podobny problem jak @puppet. To właśnie zadziałało dla mnie: import io; from PIL import Image; img = Image.open(io.BytesIO(image)); img.save("image.png")
Somto Muotoe
9

W Node.js, napisałem następujący kod, który działa, ale nie jest oparty na oficjalnym WebDriverJS selenu, ale na SauceLabs's WebDriver: WD.js i bardzo kompaktowej bibliotece obrazów o nazwie EasyImage .

Chcę tylko podkreślić, że tak naprawdę nie możesz zrobić zrzutu ekranu elementu, ale powinieneś najpierw zrobić zrzut ekranu całej strony, a następnie wybrać część strony, którą lubisz i przyciąć tę konkretną część:

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

A cropInFileFunction wygląda tak:

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
źródło
Twoja biblioteka EasyImage jest uszkodzona: „ImageMagickMissingError”
Nizar B.
9

Framework ASHOT firmy Yandex może być używany do robienia zrzutów ekranu w skryptach Selenium WebDriver dla

  • pełne strony internetowe
  • elementy sieci

Te ramy można znaleźć na https://github.com/yandex-qatools/ashot .

Kod do robienia zrzutów ekranu jest bardzo prosty:

CAŁA STRONA

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

SPECYFICZNY ELEMENT INTERNETOWY

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

Zobacz więcej szczegółów i więcej przykładów kodu w tym artykule .

Alex Siminiuc
źródło
Należy uważać, może trzeba .shootingStrategy(ShootingStrategies.viewportPasting(100))też z SPECIFIC WEB ELEMENTtrybu lub nie może przechwycić cały element.
user1686407
8

Dla wszystkich proszących o kod w C # poniżej znajduje się uproszczona wersja mojej implementacji.

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);
    }
}
Potok
źródło
Dziękuję Ci. To było bardzo pomocne, trafne i doskonałe.
Sorrel Vesper,
5

Zmarnowałem dużo czasu na zrobienie zrzutu ekranu i chcę zapisać twój. Użyłem chromu + selenu + c # efekt był okropny. Wreszcie napisałem funkcję:

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
źródło
1
Działa idealnie, o ile próbujesz uchwycić element, który jest widoczny bez przewijania. Kiedy musisz przewinąć do elementu, aby go przechwycić, przesunięcie y jest obliczane od góry strony, która następnie przekracza granice obrazu pełnoekranowego. Więc najłatwiejszym rozwiązaniem jest albo zwiększenie kodu rozmiaru ekranu this.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); lub usunąć wszelkie niepotrzebne elementy przez css. Właściwym rozwiązaniem byłoby obliczenie przesunięcia y przy przewijaniu.
Ichwardort
4

Odpowiedź Suryi działa świetnie, jeśli nie masz nic przeciwko zaangażowaniu we / wy dysku. Jeśli nie chcesz, ta metoda może być dla Ciebie lepsza

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

Jeśli wolisz, możesz pominąć deklarowanie screengrabi zamiast tego robić

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

który jest czystszy, ale zostawiłem to dla jasności. Następnie możesz zapisać go jako plik lub umieścić go w JPanelu do woli .

rath
źródło
3

Python 3

Próbowałem z Selenium 3.141.0 i chromedriver 73.0.3683.68, to działa,

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

Nie ma potrzeby pobierania pełnego obrazu i pobierania fragmentu obrazu pełnoekranowego.

To mogło nie być dostępne, gdy tworzono odpowiedź Rohita .

rovr138
źródło
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
źródło
2

Jeśli szukasz rozwiązania JavaScript, oto moja istota:

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

Podstawowy pomysł jest taki sam, najpierw zrób zrzut ekranu, a następnie przytnij go. Jednak moje rozwiązanie nie będzie wymagało innych bibliotek, tylko czysty kod API WebDriver. Jednak efektem ubocznym jest to, że może to zwiększyć obciążenie przeglądarki testowej.

silikon
źródło
Proszę wkleić kod w swojej odpowiedzi zamiast łączyć się z innym źródłem
supersan
2

Oto funkcja rozszerzenia dla 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();
    }
}

Teraz możesz go użyć do zrobienia zdjęcia dowolnego elementu, takiego jak ten:

var image = webDriver.GetElementImage(By.Id("someId"));
Hüseyin Yağlı
źródło
1

Rozważ użycie igły - narzędzia do automatycznego porównywania wizualnego https://github.com/bfirsh/needle , które ma wbudowaną funkcjonalność pozwalającą na robienie zrzutów ekranu konkretnych elementów (wybranych przez selektor CSS). Narzędzie działa na WebDriver Selenium i jest napisane w Pythonie.

Jan Różycki
źródło
1

Poniżej funkcja robienia migawki określonego elementu w Selenium. Tutaj sterownik jest rodzajem 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
źródło
Zobacz ten link, aby uzyskać więcej informacji: [Automation Hub Point] ( automationhubpoint.blogspot.in/2017/01/… )
ER.swatantra
1

kod c #:

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;
}
Andrzej
źródło
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
źródło
0

Jeśli pojawi się wyjątek java.awt.image.RasterFormatException w przeglądarce chrome lub chcesz przewinąć element do widoku, a następnie zrób zrzut ekranu.

Oto rozwiązanie z odpowiedzi @Surya.

        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);
Green Lei
źródło
Używam selenium-java-2.53.1, grupa kompilacji: 'org.seleniumhq.selenium', nazwa: 'selenium-java', wersja: '2.53.1', sterownik chrome-web, próbuję przyciąć przez .xpath (".// img [@class = 'captcha']") ze strony internetowej resident.uidai.gov.in/offlineaadhaar , Twój kod nie działa poprawnie. Przycina niewłaściwą część strony. czy możesz mi pomóc w przycięciu captcha.
vijay
0

To jest moja wersja, w C # w zasadzie uzyskałem większość z odpowiedzi Brook i zmodyfikowałem ją, aby pasowała do moich celów

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
źródło
0

Myślę, że większość odpowiedzi tutaj jest przesadzona. Sposób, w jaki to zrobiłem, to dwie metody pomocnicze, pierwsza czekająca na element oparty na dowolnym selektorze; a drugi, aby zrobić zrzut ekranu.

Uwaga: Mamy rzucać WebElementna TakesScreenshotprzykład, więc tylko uchwycić ten element w obrazie specjalnie. Jeśli chcesz mieć całą stronę / okno, driverzamiast tego prześlij.

WebDriver driver = new FirefoxDriver(); // define this somewhere (or chrome etc)

public <T> T screenshotOf(By by, long timeout, OutputType<T> type) {
    return ((TakesScreenshot) waitForElement(by, timeout))
            .getScreenshotAs(type);
}

public WebElement waitForElement(By by, long timeout) {
    return new WebDriverWait(driver, timeout)
            .until(driver -> driver.findElement(by));
}

A potem po prostu zrób zrzut ekranu, co chcesz, w ten sposób:

long timeout = 5;   // in seconds
/* Screenshot (to file) based on first occurence of tag */
File sc = screenshotOf(By.tagName("body"), timeout, OutputType.FILE); 
/* Screenshot (in memory) based on CSS selector (e.g. first image in body
who's "src" attribute starts with "https")  */
byte[] sc = screenshotOf(By.cssSelector("body > img[href^='https']"), timeout, OutputType.BYTES);
Lorenzo
źródło
-1

Uważam, że to nie zadziała, ponieważ używasz C #, a moje rozwiązanie zawiera bibliotekę Java, ale może inni uznają to za pomocne.

Do przechwytywania niestandardowych zrzutów ekranu możesz użyć biblioteki Shutterbug. Konkretne wezwanie do tego celu brzmiałoby:

Shutterbug.shootElement(driver, element).save();
Marlies
źródło
-1

Postępowałem zgodnie z przykładowym kodem z @codeslord, ale z jakiegoś powodu musiałem inaczej uzyskać dostęp do moich danych zrzutu ekranu:

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

(przy użyciu Python 3.7, Selenium 3.141.0 i Mozilla Geckodriver 71.0.0.7222)

Rishi Latchmepersad
źródło
-2

Używam zmodyfikowanej wersji odpowiedzi @ Brook i działa dobrze nawet w przypadku elementów wymagających przewijania strony.

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

Te dwa elementy ifbyły konieczne (przynajmniej dla sterownika Chrome), ponieważ rozmiar przycięcia przekraczał o 1 piksel rozmiar zrzutu ekranu, gdy potrzebne było przewijanie.

thepirat000
źródło
Otrzymuję ten błąd, kiedy próbuję twojej metody: Nie można rzutować przezroczystego serwera proxy na wpisanie „OpenQA.Selenium.Remote.RemoteWebElement”
shanabus
Używam tego wyłącznie ze sterownikiem Chrome, którego sterownika używasz?
thepirat000
Używam również ChromeDriver. Moje testy używają IWebElements i postępujemy zgodnie z metodą PageFactory z pakietu NuGet OpenQA.Selenium.Support.
shanabus