用過 WebDriver 的同學都知道,WebDriver 可以對瀏覽器中的頁面進行截圖。例如:
1
2
3
4
|
public byte [] takeScreenshot() throws IOException { TakesScreenshot takesScreenshot = (TakesScreenshot) driver; return takesScreenshot.getScreenshotAs(OutputType.BYTES); } |
這樣產(chǎn)生的圖片是整個網(wǎng)頁。但有時候我們并不需要整個網(wǎng)頁,只需要某些特定的 WebElement,以避免一些干擾。
雖然 WebDriver 本身沒有提供這樣的 API,不過我們可以自己來,就是在全屏的截圖中再進行裁剪,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public BufferedImage createElementImage(WebElement webElement) throws IOException { // 獲得webElement的位置和大小。 Point location = webElement.getLocation(); Dimension size = webElement.getSize(); // 創(chuàng)建全屏截圖。 BufferedImage originalImage = ImageIO.read( new ByteArrayInputStream(takeScreenshot())); // 截取webElement所在位置的子圖。 BufferedImage croppedImage = originalImage.getSubimage( location.getX(), localtion.getY(), size.getWidth(), size.getHeight()); return croppedImage; } |
其中 ImageIO 和 BufferedImage 分別來自 javax.imageio 和 java.awt.image。
這種方法可以很好的削減截圖的大小,也避免了一些不確定因素(比如日期時間等),是測試中保存截圖的很好的方式。
注:如果測試的網(wǎng)頁中含有 iframe,則需要使用更復雜的方式計算 WebElement 的位置,詳見:計算網(wǎng)頁中某個元素的位置。