首先說一下截圖的方式把,我用過兩種。html
第一種:java
1 public static void screenShotAsFile(int x, int y, int width, int height, String fileName) { 2 try { 3 Robot robot = new Robot(); 4 BufferedImage bfImage = robot.createScreenCapture(new Rectangle(x, y, width, height)); 5 File path = new File("D:\\eclipseFile\\baiduFile"); 6 File file = new File(path, fileName+ "." + "jpg"); 7 ImageIO.write(bfImage, "jpg", file); 8 } catch (AWTException e) { 9 e.printStackTrace(); 10 } catch (IOException e) { 11 e.printStackTrace(); 12 } 13 }
這一種,能夠自定義截圖的區域。我在使用中須要截取不含電腦桌面下方菜單欄的圖片,也就是瀏覽器全屏顯示界面的區域,使用的值是(0, 0, 1360, 716)。瀏覽器
第二種:session
public static void getScreenshot(WebDriver driver, String photoName) { try { // 得到屏幕截圖並以文件的形式返回 File srcFile = ((TakesScreenshot) driver) .getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile, new File("D:\\eclipseFile\\baiduFile\\" + potoName + "_screenshot.jpg")); } catch (Exception e) { e.printStackTrace(); } }
這一種是利用WebDriver截圖,截取的圖片是瀏覽器中的網頁。eclipse
這兩種方式都很簡單實用,在自動化測試中,我更傾向於第二種方式,沒有爲何,以爲用的更舒服一些。但有一點我以爲很討厭,使用這種方式封裝的方法須給它傳進一個WebDriver參數。這個真的很煩啊,好比我在自動化測試中,想在測試到異常後統一調用這個方法進行截圖,因爲測試用到的其它方法都是封裝好了,並且一個用例裏面我必須保持一個driver,新的用例必須使用新的driver(每一次測試需從新創建一個新的session),因爲每次用例的driver不是共享的,因此在最後很難統一來處理(好比將其放在@aftertest標籤下調用),我不可能爲了調用它去從新new一個driver把,因此我目前的解決辦法就是將其放在其它傳有driver對象的方法裏調用,即便如此,我依舊以爲麻煩。測試
經過上面的截圖方式,會將圖片保存到你指定的存儲地址中,若是咱們想在測試結果的報表中顯示圖片,那麼只需在日誌中輸出包含圖片地址的<img>標籤就行了,以下:ui
public static void sendReport(String typeSend, String txt) { Reporter.setEscapeHtml(false); String sreenShotLink = "<a href=\"file:///D:\\eclipseFile\\baiduFile\\"+ txt + "_screenshot.png\" target=\"_blank\">截圖名稱:" + txt + "</a>"; String sreenShotImg = "<p>截圖:<img id=\"img\" src=\"file:///D:\\eclipseFile\\baiduFile\\" + txt + "_screenshot.png\" alt=\"Smiley face\" width=\"200\" height=\"200\"></p>"; String reportStr = txt; switch (typeSend) { case "link": Reporter.log(sreenShotLink); break; case "img": Reporter.log(sreenShotImg); break; case "txt": Reporter.log(reportStr); break; default: break; } }
可是,如今存在一個問題,當咱們將包含圖片地址的<img>標籤輸出到TestNG日誌中時,出人意料的是圖片並無顯示,我去,它居然將整個<img>標籤連同圖片地址的源碼輸出到報表中。spa
爲何會這樣呢?答案其實很明顯,整個<ing>標籤的源碼在輸出到ReportNG報表的html文檔的過程當中被TestNG給轉義了(你能夠用UE查看下報表文檔的html源碼),這就很膩害呢!日誌
當時在百度的過程當中,看到一些「老油條」,是用本身寫的方法,將地址傳到報表文檔中,但這些「老油條」都寫的很簡略,雖然貼出了代碼,但傳遞的具體機制,卻說的很模糊,本身試了試,遺憾並無成功。我當時就有個想法,我已經知道,它既然是被TestNG轉義了,那我只需找到源碼中轉義的地方,稍稍的修改下源碼,<img>標籤不就能夠正常輸出了嗎?code
基於上面的想法,我立刻找到了案發的第一現場:
/** * Converts a char into a String that can be inserted into an XML document, * replacing special characters with XML entities as required. * @param character The character to convert. * @return An XML entity representing the character (or a String containing * just the character if it does not need to be escaped). */ private String escapeChar(char character) { switch (character) { case '<': return "<"; case '>': return ">"; case '"': return """; case '\'': return "'"; case '&': return "&"; default: return String.valueOf(character); } }
它的地址位於reportng JAR包下org.uncommons.reportng包下的ReportNGUtils.java。
這樣解決辦法就一目瞭然了啊,將被轉義的地方註釋掉就行了嘛。
至於如何修改JAR包中的源碼,直接找到這個java類的源碼,在eclipse中新建與其對應的同名包同名類,那麼在項目運行過程當中,源碼中的這個類就會被你新建的這個類覆蓋啦。