私が取ったからコード持ってこのチュートリアルを。それはlearn-selenium-easy.blogspot.comウェブサイトに行き、ほとんどの記事を読む/人気の投稿セクションを探し、それを撮影します:
class SshotofElement {
public static void screenShotElement() throws InterruptedException,IOException {
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("marionette", true);
WebDriver driver = new ChromeDriver(capabilities);
driver.get("http://learn-selenium-easy.blogspot.com/");
driver.manage().window().maximize();
// Xpath of element to take screen shot
WebElement element=driver.findElement(By.xpath("//*[@id='PopularPosts1']"));
System.out.println(element.getSize());
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// Take full screen screenshot
BufferedImage fullImg = ImageIO.read(screenshot);
Point point = element.getLocation();
int elementWidth = element.getSize().getWidth();
int elementHeight = element.getSize().getHeight();
BufferedImage elementScreenshot= fullImg.getSubimage(point.getX(), point.getY(), elementWidth,elementHeight); //exception here
// crop the image to required
ImageIO.write(elementScreenshot, "png", screenshot);
FileUtils.copyFile(screenshot, new File("mostread_screenshot.png"));//path to save screen shot
driver.close();
}
}
私が取得java.awt.image.RasterFormatException: (y + height) is outside of Raster
しかしライン上で、例外をBufferedImage elementScreenshot= fullImg.getSubimage(point.getX(), point.getY(), elementWidth,elementHeight);
。画像のポイントとサイズは要素自体から取られているので、それは、ケースだろう、なぜ私はわかりません。
あなたがトリミングされている要素画像は、コードによって撮影したスクリーンショットには存在しません。デバッグを入れて、フルスクリーンショットのパスを印刷し、それを手動で表示した場合、あなたは画像からトリミングされるべき所望の要素がその中に存在していないことがわかります。
だから、最初に我々はする必要があるページをスクロールさせるに必要な要素をに表示して、スクリーンショットを撮ります。その後、我々は、要素の位置に基づいて画像をトリミングする必要があります。
また、
Point
このクラスは、要素の正確な位置を与えることは非常に信頼性がありません。第二に、我々は値を下回る見れば
ImageIO.read(screenshot).getHeight() // ~ 943 => Total height element.getSize().getHeight() // ~ 511 => Element height point.getY() // ~ 743 => start top side y coordinate of element
それは、元のスクリーンショット座標の出て行った743の高さとyの、長方形をxから引き出されたとき、私は信じているので。
だから我々は、座標を通過する間にいくつかの調整を行う必要があります。
@Test
public void subImageTest() throws InterruptedException, IOException {
driver.get("http://learn-selenium-easy.blogspot.com/");
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,600)");
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
WebElement element=driver.findElement(By.xpath("//*[@id='PopularPosts1']"));
System.out.println(element.getSize());
// Take full screen screenshot
BufferedImage fullImg = ImageIO.read(screenshot);
ImageIO.read(screenshot).getHeight()
System.out.println(fullImg.getHeight());
System.out.println(fullImg.getWidth());
Point point = element.getLocation();
int elementWidth = element.getSize().getWidth();
int elementHeight = element.getSize().getHeight();
// Now no exception here
BufferedImage elementScreenshot= fullImg.getSubimage(220, 170,elementWidth+150,elementHeight+100);
// crop the image to required
ImageIO.write(elementScreenshot, "png", screenshot);
FileUtils.copyFile(screenshot, new File("C:\\Users\\AppData\\Local\\Temp\\mostread_screenshot.png"));//path to save screen shot
}