TestNG在生成的報表中添加自動截圖

首先說一下截圖的方式把,我用過兩種。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中新建與其對應的同名包同名類,那麼在項目運行過程當中,源碼中的這個類就會被你新建的這個類覆蓋啦。

相關文章
相關標籤/搜索