セレン:java.awt.image.RasterFormatException:要素のサイズと位置を使用している場合(Y +高さ)Rasterの外側であります

parsecer:

私が取ったからコード持ってこのチュートリアルを。それは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);画像のポイントとサイズは要素自体から取られているので、それは、ケースだろう、なぜ私はわかりません。

アミット・ジェイン:
  1. あなたがトリミングされている要素画像は、コードによって撮影したスクリーンショットには存在しません。デバッグを入れて、フルスクリーンショットのパスを印刷し、それを手動で表示した場合、あなたは画像からトリミングされるべき所望の要素がその中に存在していないことがわかります。

  2. だから、最初に我々はする必要があるページをスクロールさせるに必要な要素を表示して、スクリーンショットを撮ります。その後、我々は、要素の位置に基づいて画像をトリミングする必要があります。

  3. また、Pointこのクラスは、要素の正確な位置を与えることは非常に信頼性がありません。

  4. 第二に、我々は値を下回る見れば

    ImageIO.read(screenshot).getHeight() // ~ 943 => Total height
    element.getSize().getHeight() // ~ 511 => Element height 
    point.getY() // ~ 743 => start top side y coordinate of element
    
  5. それは、元のスクリーンショット座標の出て行った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

}

ここでの要素の最終的なサブ画像プログラムを実行した後、 ここでは、画像の説明を入力します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=239169&siteId=1