Làm cách nào để chụp ảnh màn hình của một phần tử cụ thể thay vì toàn bộ trang bằng Selenium Webdriver?


82

Hiện tôi đang cố chụp ảnh màn hình bằng Selenium WebDriver. Nhưng tôi chỉ có thể có được ảnh chụp màn hình toàn trang. Tuy nhiên, những gì tôi muốn chỉ là chụp một phần của trang hoặc có lẽ chỉ trên phần tử cụ thể dựa trên ID hoặc bất kỳ bộ định vị phần tử cụ thể nào. (Ví dụ: tôi muốn chụp ảnh với id hình ảnh = "Butterfly")

Có cách nào để chụp ảnh màn hình theo mục hoặc phần tử đã chọn không?


1
AFAIK, cơ sở chỉ để chụp toàn bộ trang. Chúng tôi không có chức năng chụp ảnh màn hình lấy id hoặc tên phần tử làm đầu vào.
Hemanth 12/12/12

Bất cứ ai có thể cho tôi biết phương thức gọi BUfferedImage trong c # là gì? Tôi không thể tìm thấy bất kỳ phương pháp tương tự nào liên quan đến điều này.
fj123 13/12/12

Câu trả lời:


117

Chúng ta có thể lấy ảnh chụp màn hình phần tử bằng cách cắt ảnh chụp màn hình toàn bộ trang như bên dưới:

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

Cảm ơn bạn đã trả lời. Tuy nhiên, tại sao webdriver của tôi khác với trình điều khiển của bạn. nó sử dụng IWebDriver, ITakeScreenshot và không có OutputType.FILE và BufferedImage ... đang i sử dụng phiên bản cũ của selen webdriver?
fj123

Bạn có đang sử dụng ràng buộc C # webdriver không?
Surya

Vâng tôi cũng nghĩ thế. Trước đây tôi đang sử dụng RC và tôi chỉ thay đổi để sử dụng trình điều khiển web gần đây.
fj123 12/12/12

Việc triển khai này dành cho liên kết Java. Khái niệm này cũng nên hoạt động cho C #. Nhưng tôi không biết nhiều về ngôn ngữ C #. Bạn cần phải sử dụng C # thư viện tương đương (BufferedImage, ImageIO ...)
Surya

4
Mã trên không hoạt động trong Chrome. Một ngoại lệ java.awt.image.RasterFormatException: (y + height) nằm ngoài Raster đã được ném vào dòng BufferedImage eleScreenshot = fullImg.getSubimage (point.getX (), point.getY (), eleWidth, eleHeight);
Ripon Al Wasim

13

Đây là phiên bản Python 3 sử dụng Selenium webdriver và Pillow. Chương trình này chụp ảnh màn hình của toàn bộ trang và cắt phần tử dựa trên vị trí của nó. Hình ảnh phần tử sẽ có sẵn dưới dạng image.png. Firefox hỗ trợ lưu hình ảnh phần tử trực tiếp bằng 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')

Cập nhật

Giờ đây, chrome cũng hỗ trợ ảnh chụp màn hình phần tử riêng lẻ. Vì vậy, bạn có thể chụp trực tiếp ảnh chụp màn hình của phần tử web như bên dưới.

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

4
Tôi khá chắc rằng điều đó element.sizeđược tính bằng điểm, trong khi ảnh chụp màn hình được tạo bởi driver.save_screenshotcó kích thước pixel. Nếu màn hình của bạn có tỷ lệ pixel-to-point khác 1 (ví dụ: MacBook màn hình retina có hai pixel trên mỗi điểm - tỷ lệ 2) thì bạn cần nhân whvới tỷ lệ đó.
BallpointBen

phiên bản mới đã có thể sử dụng element.screenshot ('elemenent.png'), hãy xem câu trả lời của @ rovr138
tinyhare

@tinyhare Nó chỉ có sẵn trong Firefox khi câu trả lời được tạo. Tôi nghĩ rằng nó cũng có sẵn trong chrome bây giờ. Đang cập nhật câu trả lời.
Codelord

1
@puppet Đối với việc tải bộ nhớ, hãy thực hiện việc này. from StringIO import StringIO; from PIL import Image; img = Image.open(StringIO(image))
Codelord

1
Tôi gặp sự cố tương tự như @puppet. Đây là những gì làm việc cho tôi: import io; from PIL import Image; img = Image.open(io.BytesIO(image)); img.save("image.png")
Somto Muotoe

9

Trong Node.js, tôi đã viết đoạn mã sau đây hoạt động nhưng nó không dựa trên WebDriverJS chính thức của selen, mà dựa trên SauceLabs's WebDriver: WD.js và một thư viện hình ảnh rất nhỏ gọn có tên là EasyImage .

Tôi chỉ muốn nhấn mạnh rằng bạn không thể thực sự chụp ảnh màn hình của một phần tử nhưng điều bạn nên làm là trước tiên, chụp ảnh màn hình của toàn trang, sau đó chọn phần của trang bạn thích và cắt phần cụ thể đó:

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

Và cropInFileFunction, sẽ như thế này:

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

Thư viện EasyImage của bạn bị hỏng: "ImageMagickMissingError"
Nizar B.

9

Khung ASHOT từ Yandex có thể được sử dụng để chụp ảnh màn hình trong các tập lệnh Selenium WebDriver cho

  • trang web đầy đủ
  • yếu tố web

Khung này có thể được tìm thấy trên https://github.com/yandex-qatools/ashot .

Mã để chụp ảnh màn hình rất đơn giản:

TOÀN BỘ TRANG

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

YẾU TỐ WEB CỤ THỂ

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

Xem thêm chi tiết và nhiều mẫu mã hơn trên bài viết này .


Hãy cẩn thận, bạn cũng có thể cần .shootingStrategy(ShootingStrategies.viewportPasting(100))với SPECIFIC WEB ELEMENTchế độ, hoặc nó có thể không nắm bắt được tất cả các yếu tố.
user1686407

8

Đối với tất cả mọi người yêu cầu mã bằng C #, dưới đây là phiên bản đơn giản của việc triển khai của tôi.

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

Cảm ơn bạn. Điều đó rất hữu ích và đã đến mức hoàn hảo.
Sorrel Vesper

5

Tôi đã lãng phí rất nhiều thời gian vào việc chụp ảnh màn hình và tôi muốn lưu ảnh của bạn. Tôi đã sử dụng chrome + selen + c #, kết quả hoàn toàn khủng khiếp. Cuối cùng tôi đã viết một hàm:

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

1
Nó hoạt động hoàn toàn tốt miễn là bạn thử chụp một phần tử có thể nhìn thấy được mà không cần cuộn. Khi bạn cần cuộn đến một phần tử để chụp nó, thì độ lệch y được tính từ đầu trang, sau đó vượt quá ranh giới của hình ảnh toàn màn hình. Vì vậy, giải pháp đơn giản nhất là tăng kích thước màn hình mã this.driver.manage (). Window (). SetSize (new Dimension (1680, 1050)); hoặc để loại bỏ bất kỳ phần tử không bắt buộc nào thông qua css. Giải pháp thích hợp sẽ là tính toán độ lệch y từ việc cuộn.
Ichwardort

3

Câu trả lời của Surya hoạt động tuyệt vời nếu bạn không ngại liên quan đến IO đĩa. Nếu bạn không muốn, thì phương pháp này có thể tốt hơn cho bạn

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

Nếu bạn thích, bạn có thể bỏ qua khai báo screengrabvà thay vào đó làm

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

cái nào sạch hơn, nhưng tôi để nó trong cho rõ ràng. Sau đó, bạn có thể lưu nó thành một tệp hoặc đặt nó trong một JPanel để chứa nội dung trái tim của bạn.


3

Python 3

Đã thử với Selenium 3.141.0 và chromedriver 73.0.3683.68, điều này hoạt động,

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

Không cần lấy toàn bộ hình ảnh và lấy một phần của hình ảnh toàn màn hình.

Điều này có thể không có khi câu trả lời của Rohit được tạo ra.


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

2

Nếu bạn đang tìm kiếm một giải pháp JavaScript, đây là ý chính của tôi:

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

Ý tưởng cơ bản là giống nhau, chụp ảnh màn hình trước, sau đó cắt nó. Tuy nhiên, giải pháp của tôi sẽ không yêu cầu các thư viện khác, chỉ cần mã API WebDriver thuần túy. Tuy nhiên, tác dụng phụ là nó có thể làm tăng tải trình duyệt thử nghiệm của bạn.


Vui lòng dán mã vào câu trả lời của bạn thay vì liên kết với một nguồn khác
supersan

2

Đây là một hàm mở rộng cho 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();
    }
}

Bây giờ bạn có thể sử dụng nó để chụp ảnh của bất kỳ phần tử nào như sau:

var image = webDriver.GetElementImage(By.Id("someId"));

1

Cân nhắc sử dụng kim - công cụ để so sánh trực quan tự động https://github.com/bfirsh/needle , có chức năng tích hợp cho phép chụp ảnh màn hình của các phần tử cụ thể (được chọn bởi bộ chọn CSS). Công cụ này hoạt động trên WebDriver của Selenium và nó được viết bằng Python.


1

Bên dưới chức năng chụp ảnh nhanh một phần tử cụ thể trong Selenium. Ở đây trình điều khiển là một loại 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);
 }

Xem liên kết này để biết thêm: [Điểm trung tâm tự động hóa] ( automationhubpoint.blogspot.in/2017/01/… )
ER.swatantra

1

c # mã:

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

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

0

Nếu bạn nhận được một ngoại lệ java.awt.image.RasterFormatException trong chrome hoặc bạn muốn cuộn một phần tử vào chế độ xem thì hãy chụp ảnh màn hình.

Đây là một giải pháp từ câu trả lời @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);

Tôi đang sử dụng selenium-java-2.53.1, nhóm biên dịch: 'org.seleniumhq.selenium', name: 'selenium-java', phiên bản: '2.53.1', chrome-web-driver, tôi đang cố gắng cắt By .xpath (".// img [@class = 'captcha']") từ trang web Resident.uidai.gov.in/offlineaadhaar , Nhưng mã của bạn không hoạt động bình thường. Nó cắt một số phần sai của trang. bạn có thể vui lòng giúp tôi để lấy hình ảnh xác thực bị cắt.
vijay

0

Đây là phiên bản của tôi, trong C #, về cơ bản tôi đã hiểu được hầu hết câu trả lời của Brook và sửa đổi nó để phù hợp với mục đích của tôi

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

-1

Tôi tin rằng điều này sẽ không hiệu quả với bạn khi bạn sử dụng C # và giải pháp của tôi bao gồm một thư viện Java, tuy nhiên có thể những người khác sẽ thấy nó hữu ích.

Để chụp ảnh màn hình tùy chỉnh, bạn có thể sử dụng thư viện Shutterbug. Lời gọi cụ thể cho mục đích này sẽ là:

Shutterbug.shootElement(driver, element).save();

-1

Tôi đã làm theo mã mẫu từ @codeslord, nhưng vì một số lý do mà tôi phải truy cập dữ liệu ảnh chụp màn hình của mình theo cách khác:

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

(sử dụng Python 3.7, Selenium 3.141.0 và Mozilla Geckodriver 71.0.0.7222)


-2

Tôi đang sử dụng phiên bản sửa đổi của câu trả lời @ Brook và đang hoạt động tốt ngay cả đối với các phần tử cần cuộn trang.

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

Hai ifs là cần thiết (ít nhất là đối với trình điều khiển chrome) vì kích thước của phần cắt vượt quá kích thước ảnh chụp màn hình 1 pixel khi cần cuộn.


Tôi nhận được lỗi này khi tôi thử phương pháp của bạn: Không thể bỏ proxy trong suốt để gõ 'OpenQA.Selenium.Remote.RemoteWebElement'
shanabus

Tôi chỉ sử dụng điều này với Trình điều khiển Chrome, bạn sử dụng trình điều khiển nào?
thepirat000

Tôi cũng đang sử dụng ChromeDriver. Các thử nghiệm của tôi đang sử dụng IWebElements và chúng tôi đang làm theo phương pháp PageFactory từ gói nuget OpenQA.Selenium.Support.
shanabus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.