Javascript Selenium:捕获DOM元素图像

Javascript Selenium:捕获DOM元素图像,javascript,java,selenium,spring-boot,raster,Javascript,Java,Selenium,Spring Boot,Raster,我有一个API来捕获DOM中特定元素的图像并返回它们。为此,我有一个需要捕获到单个网页中的WebElements列表。同样,我已经找到了一个解决方案,如果一个元素在屏幕上是可见的(无需向下滚动即可看到),那么它可以很好地工作 但是我需要向下滚动查看java.awt.image.RasterFormatException中的元素结果的情况是:(y+height)在光栅之外。所以我加了这个 我试过的 问题是在需要滚动某些元素的地方,如何捕获特定元素的图像。请注意,对于多个源,我有多个元素具有the

我有一个API来捕获DOM中特定元素的图像并返回它们。为此,我有一个需要捕获到单个网页中的WebElements列表。同样,我已经找到了一个解决方案,如果一个元素在屏幕上是可见的(无需向下滚动即可看到),那么它可以很好地工作

但是我需要向下滚动查看
java.awt.image.RasterFormatException中的元素结果的情况是:(y+height)在光栅之外。所以我加了这个

我试过的


问题是在需要滚动某些元素的地方,如何捕获特定元素的图像。请注意,对于多个源,我有多个元素具有there By.id、By.name、By.xpath,因此我无法通过
y+100
设置
fullImg.getSubimage(x、y、w、h)
。任何帮助都将不胜感激

System.setProperty("webdriver.chrome.driver", "F:\\chromedriver");
WebDriver driver = new ChromeDriver();
driver.get("https://www.testing-whiz.com/demoscripts/basic-element.html");
WebElement ele = getElement();

// 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
try {
BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(), eleWidth, eleHeight);
ImageIO.write(eleScreenshot, "png", screenshot);
}catch (Exception e) {
    js.executeScript("window.scrollBy(0,450)");
    //point.getY() = 732            //From console y = 492.8000183105469 after scroll https://stackoverflow.com/a/38767558/10961238
    //raster.getHeight() = 613
    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("F:\\Images\\1.png");
FileUtils.copyFile(screenshot, screenshotLocation);
  • 后端:Spring引导(Java11)
  • 前端:角度

  • WebElement
    扩展了
    TakesScreenshot
    ,这意味着您可以直接在
    WebElement
    上使用
    getScreenshotAs
    。你可以

    public void takeElementScreenshot(WebElement element) {
        driver.executeScript("arguments[0].scrollIntoView();", element);
        File screenshot = ele.getScreenshotAs(OutputType.FILE);
        //...
    }
    
    你可以在滚动之前,但我不认为这是必要的,只是每次滚动

    System.setProperty("webdriver.chrome.driver", "F:\\chromedriver");
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.testing-whiz.com/demoscripts/basic-element.html");
    WebElement ele = getElement();
    
    // 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
    try {
    BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(), eleWidth, eleHeight);
    ImageIO.write(eleScreenshot, "png", screenshot);
    }catch (Exception e) {
        js.executeScript("window.scrollBy(0,450)");
        //point.getY() = 732            //From console y = 492.8000183105469 after scroll https://stackoverflow.com/a/38767558/10961238
        //raster.getHeight() = 613
        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("F:\\Images\\1.png");
    FileUtils.copyFile(screenshot, screenshotLocation);
    
    public void takeElementScreenshot(WebElement element) {
        driver.executeScript("arguments[0].scrollIntoView();", element);
        File screenshot = ele.getScreenshotAs(OutputType.FILE);
        //...
    }