如何通过嵌入图像将HTML报告(作为附件)发送电子邮件?

时间:2017-02-08 14:09:42

标签: java html selenium report javamail

我正在创建一个包含ExtentReports的报告,通过电子邮件发送给域外的团队成员。我使用截图方法(如下)来保存测试失败的屏幕截图。它们存储在ExtentReports HTML报告的子文件夹中。

我将报告附加到电子邮件中,其中,图像对于具有文件夹权限的域上的团队成员显示正常。但我不知道如何允许人们在该文件夹的权限之外,查看报告中嵌入的图像。这是图像的HTML,直接引用该文件。

<img class="report-img" data-featherlight="file:///\\domain.local\files\QA\Projects\AutomationReports\ExtentScreens\1486487870116.jpg" src="file:///\\domain.local\files\QA\Projects\AutomationReports\ExtentScreens\1486487870116.jpg">

这是我的截图方法。

public static String CaptureScreen(WebDriver driver) {
    String ImagesPath = "\\\\domain.local\\files\\QA\\Projects\\AutomationReports\\ExtentScreens\\"
            + new Date().getTime();

    TakesScreenshot oScn = (TakesScreenshot) driver;
    File oScnShot = oScn.getScreenshotAs(OutputType.FILE);
    File oDest = new File(ImagesPath + ".jpg");

    // System.out.println(ImagesPath);

    try {
        FileUtils.copyFile(oScnShot, oDest);
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
    return ImagesPath + ".jpg";
}

我有两个关于如何解决这个问题的无关的想法。但我需要一些帮助才能开始使用其中任何一个。我愿意接受其他建议。

  1. 将图片直接嵌入到HTML报告中,或以某种方式发送包含HTML报告的屏幕截图的文件夹。但是,HTML仍将引用我的原始位置,图像将被破坏。

  2. 与Everyone,Guest和匿名用户共享包含图像的文件夹,以便域外的人可以打开引用此位置的HTML。我不知道如何设置这些权限,我甚至不确定这样做是否允许外部用户查看引用该位置的HTML。

5 个答案:

答案 0 :(得分:1)

请尝试使用base64编码,它肯定会有效。 另外,请检查您的浏览器支持。

试试这个:

<img src="data:image/jpeg;base64,/9j/4AAQxxxxxxxx...." />

答案 1 :(得分:0)

根据您需要support所需的浏览器,您可以将图片嵌入到base64中。像这样:

<img src="data:image/jpeg;base64, LzlqLzRBQ...<!-- base64 data -->" />

Here is a tool to encode your images

答案 2 :(得分:0)

您可以将base64编码图像直接嵌入到HTML文档中。

<img src="data:image/jpeg;base64,/9j/4AAQxxxxxxxx...." />

答案 3 :(得分:0)

您可以创建一个多部分/报告消息,其中包含的图像作为消息中的附加正文部分。 JavaMail FAQ包含以下示例代码:

    Multipart multipart = new MimeMultipart("related");

    MimeBodyPart htmlPart = new MimeBodyPart();
    // messageBody contains html that references image
    // using something like <img src="cid:XXX"> where
    // "XXX" is an identifier that you make up to refer
    // to the image
    htmlPart.setText(messageBody, "utf-8", "html");
    multipart.addBodyPart(htmlPart);

    MimeBodyPart imgPart = new MimeBodyPart();
    // imageFile is the file containing the image
    imgPart.attachFile(imageFile);
    // or, if the image is in a byte array in memory, use
    // imgPart.setDataHandler(new DataHandler(
    //      new ByteArrayDataSource(bytes, "image/whatever")));

    // "XXX" below matches "XXX" above in html code
    imgPart.setContentID("<XXX>");
    multipart.addBodyPart(imgPart);

    message.setContent(multipart);

答案 4 :(得分:0)

我们应该有一个类文件,如下所示

  

公共类GetScreenShort {

     

public static String capture(WebDriver驱动程序,String screenShotName)   抛出IOException       {           TakesScreenshot ts =(TakesScreenshot)驱动程序;

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.4.2/angular-ui-router.min.js"></script>

    <style media="screen">

    h2 {
      margin: 5px 5px 5px 5px;
    }
    body {
      display: flex;
      flex-direction: column;
    }
    .class1 {
      align-items: flex-start;
    }
    .class2 {
      align-items: center;
    }
    </style>
  </head>

  <body ng-app="graceApp" ng-class="$state.current.data.bodyClass">

    <div ui-view style="display: flex"></div>

    <script>
    angular
      .module('graceApp', [
        'ui.router'
      ])
      .config(function ($stateProvider, $urlRouterProvider) {
        $stateProvider
          .state('page1', {
            url: '/page1',
            template: '<h2>This is page1</h2> <h2>Item1</h2> <h2>Item2</h2>',
            data: {
              bodyClass: 'class1'
            }
          })
          .state('page2', {
            url: '/page2',
            template: '<h2>This is page2</h2> <h2>Item1</h2> <h2>Item2</h2>',
            data: {
              bodyClass: 'class2'
            }
          });
        $urlRouterProvider.otherwise('/page1');
      });
    </script>
</body>
</html>
     

}

必须在下面调用相同的类

  

String screenShotPath = GetScreenShort.capture(webdriver,   &#34; screenShotName&#34);