我想在selenium TestNG java中执行套件后发送一封电子邮件?

我想在selenium TestNG java中执行套件后发送一封电子邮件?,java,selenium,email,testng,Java,Selenium,Email,Testng,我有一个测试套件,在其中运行ForgotPasswordTest.java类。在套件执行结束时,我想发送一封使用AfterSuite方法生成的可发送电子邮件的报告的电子邮件。我该怎么做 这是我的套房: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" parallel="false

我有一个测试套件,在其中运行ForgotPasswordTest.java类。在套件执行结束时,我想发送一封使用AfterSuite方法生成的可发送电子邮件的报告的电子邮件。我该怎么做

这是我的套房:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="false" verbose="2">
  <listeners>
    <listener class-name="utility.ScreenshotOnFailure" />
    <listener class-name="org.uncommons.reportng.HTMLReporter" />
  </listeners> <test name="Run on Chrome">
    <parameter name="browser" value="chrome"/>
    <parameter name="grid" value="yes"></parameter>
    <parameter name="baseURL" value="https://dev.miride.com/"/>
    <classes>
      <!-- <class name="test.LoginPageTest"/> -->
      <!-- <class name="test.SignUpPageTest"/> -->
      <class name="test.ForgotPasswordTest"/>
     <!--  <class name="test.miAccountPageTest"/> -->
    </classes>
  </test>
</suite>
另外,我的Email Report.java如下:

package test;
import org.testng.annotations.Test;
import core.OpenAndCloseBrowser;
import dataProvider.DataProviderForForgotPasswordPage;
import email.emailReport;
import pages.ForgotPasswordPage;
import pages.HomePage;
import pages.LoginPage;
import org.testng.annotations.AfterSuite;
public class ForgotPasswordTest extends OpenAndCloseBrowser{

    //TC#1 - Test case to request for new password reset link
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC1")
    public void ForgotPassword_TC1(String emailaddress) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.clickResetPasswordBtn();
    }

    //TC#2 - Test case to verify validation message in case of clearing email address field
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC2")
    public void ForgotPassword_TC2(String emailaddress, String validation) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.clear_EmailAddress(emailaddress);
    fppage.verify_ValidationMessage(validation);
    }

    //TC#3 - Test case to verify validation message in case of unregistered email address
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC3")
    public void ForgotPassword_TC3(String emailaddress, String validation) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.clickResetPasswordBtn();
    fppage.verify_ValidationMessage(validation);
    }

    //TC#4 - Test case to verify validation message in case of invalid email address
    @Test(dataProviderClass=DataProviderForForgotPasswordPage.class,dataProvider="ForgotPassword_TC4")
    public void ForgotPassword_TC4(String emailaddress, String validation) throws Exception{
    HomePage homePage = new HomePage(getDriver());
    LoginPage loginPage = homePage.clickLoginLink();
    ForgotPasswordPage fppage = loginPage.clickForgotPasswordLink();
    fppage.enterEmailAddress(emailaddress);
    fppage.verify_ValidationMessage(validation);
    }

    @AfterSuite
    public void sendMail(){
        emailReport.execute();
    }
}
package email;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.testng.annotations.AfterSuite;

public class emailReport {


public static void execute() {

    // Create object of Property file
    Properties props = new Properties();

    // this will set host of server- you can change based on your requirement 
    props.put("mail.smtp.host", "smtp.gmail.com");

    // set the port of socket factory 
    props.put("mail.smtp.socketFactory.port", "465");

    // set socket factory
    props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");

    // set the authentication to true
    props.put("mail.smtp.auth", "true");

    // set the port of SMTP server
    props.put("mail.smtp.port", "465");

    // This will handle the complete authentication
    Session session = Session.getDefaultInstance(props,

            new javax.mail.Authenticator() {

                protected PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication("radhikarj94@gmail.com", "xyz");

                }

            });

    try {

        // Create object of MimeMessage class
        Message message = new MimeMessage(session);

        // Set the from address
        message.setFrom(new InternetAddress("radhikarj94@gmail.com"));

        // Set the recipient address
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("radhikarj94@gmail.com"));

                    // Add the subject link
        message.setSubject("Testing Subject");

        // Create object to add multimedia type content
        BodyPart messageBodyPart1 = new MimeBodyPart();

        // Set the body of email
        messageBodyPart1.setText("This is message body");

        // Create another object to add another content
        MimeBodyPart messageBodyPart2 = new MimeBodyPart();

        // Mention the file which you want to send
        String filename = "./test-output/Suite/emailable-report.html";

        //String filename = System.getProperty("emailable-report.html") + "./test-output/Suite/emailable-report.html";//"./test-output/Suite/emailable-report.html";
     /* \\test-output\\emailable-report.html*/
        // Create data source and pass the filename
        DataSource source = new FileDataSource(filename);

        // set the handler
        messageBodyPart2.setDataHandler(new DataHandler(source));

        // set the file
        messageBodyPart2.setFileName(filename);

        // Create object of MimeMultipart class
        Multipart multipart = new MimeMultipart();

        // add body part 1
        multipart.addBodyPart(messageBodyPart2);

        // add body part 2
        multipart.addBodyPart(messageBodyPart1);

        // set the content
        message.setContent(multipart);

        // finally send the email
        Transport.send(message);

        System.out.println("=====Email Sent=====");

    } catch (MessagingException e) {
        System.out.println("=====Email failed=====");
        throw new RuntimeException(e);

    }

}

}
抱歉,代码太长了。 最后,控制台显示:

Suite
Total tests run: 4, Failures: 0, Skips: 0
Configuration Failures: 1, Skips: 0

我可以做些什么来更正我的代码吗?

内置的TestNG报告,即,
可发送电子邮件的报告.html
由TestNG中的报告侦听器生成

默认情况下,TestNG执行报告阶段(即,仅在所有套件运行完成后,调用
org.TestNG.IReporter#generateReport
接口实现的
org.TestNG.IReporter
方法)

带有
@AfterSuite
注释的方法是在套件运行到完成之前执行的,这意味着,它甚至在生成
emailable report.html
之前执行

这可能就是您看到配置失败的原因,即
@AfterSuite
注释方法中的失败

要解决您的问题,您应该创建一个新的reporter,该reporter实现接口的
org.testng.IExecutionListener
,并在其
org.testng.IExecutionListener#onExecutionFinish
中调用
emailReport.execute();


这将有助于您完成所需任务。

由于您有一种配置方法失败,我想这就是您要发送电子邮件的配置方法。您可以尝试查看更多详细日志,到目前为止,您附加的输出没有说明太多。