我们只是刚刚召开了一个新项目的启动会议,而我需要这个新项目使ASAP自动化。如果您愿意的话,该项目本质上是一个“邮箱项目”,并且我不知道在哪里开始这种类型的项目的测试自动化,因为我对硒自动化还很陌生。但是,电子邮件将通过Gmail发送/接收。如果有可能,我将非常感谢您关于如何/在何处启动该项目自动化的任何帮助或建议...。如果可能的话:)。当然是硒:)。语言-Java

评论

通过Gmail发送电子邮件意味着什么?您是要使用Google的SMTP服务器,还是打算通过浏览器发送电子邮件?

#1 楼

如果我没记错的话,自动使用GMail就是对他们服务条款的技术侵犯。他们不会像其他许多人/公司那样对您采取行动。

来自Google服务条款


5.3您同意不通过Google所提供的界面以外的任何方式访问(或尝试访问)任何服务,除非特别允许您单独使用
进行访问。与Google达成协议。您明确同意不通过任何自动方式(包括使用脚本或网络爬网程序)访问(或尝试访问)任何服务,并应确保您
遵守说明设置在服务上存在的任何robots.txt文件中。


您实际上是否需要登录到Google网站才能执行此操作?

如果愿意,您可以使用第三方客户端,它的运行可能比通过UI进行访问要快。 Java和第三方客户端,因此,我将向您介绍我通常如何使用Outlook处理电子邮件。我通常为每个应用程序设置一个文件夹,以验证发送的电子邮件。从那里,我的代码可以访问客户端,然后访问特定的文件夹。在文件夹中时,我尝试将“自”,“至”,“抄送”,“主题”和“正文”与我的期望值进行匹配。如果我不需要进行太多验证,则只需将它们作为参数传递即可。如果必须验证所有信息,通常会创建一些字符串,可以将其设置为需要检查的值,然后尝试进行匹配。这也比通过UI容易。

评论


关于自动GMail的技术违规问题,我根本不了解,并且非常感谢您让我意识到。但是,我已经考虑了一下,我打算进行的操作方式实际上是拥有一个“测试者GMail帐户”,然后使用“测试者帐户”凭据登录,并使用一种简单的UI自动化技术GMail的搜索功能可以断言未读的电子邮件(主题),并在打开邮件后验证是否存在所有文本。我真的对如何做到这一点一无所知:(。

– Faheem
2012年1月19日,12:54

更新了参考答案以及可能的解决方法。

– Lyndon Vrooman
2012年1月19日下午14:19

#2 楼

查看Javamail API和Dumbster(伪造的SMTP服务器)。

#3 楼

我认为除非您为Google工作,否则您实际上不需要自动化Gmail UI。


我敢打赌,您的应用程序需要SMTP服务器配置。因此,它使用SMTP协议将电子邮件发送到Gmail。在这种情况下,您可以在Google上搜索“开发人员的SMTP”。并选择一些适合您需求的SMTP服务器。
在此程序中,您的工作站变成了真正的SMTP服务器,它将把您的应用程序发送的电子邮件存储为文本文件的特定文件夹。因此,您可以检查应用程序是否已发送电子邮件并查看其内容。
但是,如果第一种情况不适合您,则可以在Java代码中使用POP3客户端。您的应用程序将使用真实的smtp服务器发送电子邮件,该电子邮件将存储在Gmail服务器上,然后您可以使用测试代码接收电子邮件。
您可以在Gmail设置中更改/允许POP3协议。

无论如何,通过Gmail界面自动检查文本格式对于自动化来说确实很痛苦。但是,如果要检查应用程序是否已发送电子邮件,并且电子邮件在服务器中并且内容正确,请使用POP3客户端/开发SMTP服务器。

评论


嘿,德米特里。我看过POP3客户端,正如我之前提到的那样,在我的问题中,我对所有这些都是相当新的,并且我仅了解Java的基础知识。但是,我已经对POP3客户端进行了一些研究,并且似乎很容易实现。所以我一定会试一试。非常感谢 :)。 (我真的在挖掘这个SQA社区/网站。它真棒:D)。

– Faheem
2012年1月20日上午8:16​​

#4 楼

我的建议如下:

设置一个库,让它在您的应用程序以生产模式运行时接受邮件并发送到Gmail。但是,当应用程序以开发/测试模式运行时,请将您的电子邮件存储在数据库中。现在,创建一个简单的脚本以显示来自数据库的所有邮件(将此脚本保留在与app相同的URL下)。在测试期间,请从浏览器访问此脚本以阅读电子邮件。我们已经进行了很长一段时间了。

由于您不必从远程服务器检索数据,因此您还可以加快应用程序的测试速度。

评论


我将不是要发送邮件的人,我要做的就是验证邮件已发送给正确的用户并验证邮件的内容是否正确。但是,要发送邮件的起点是网站...这只是对通过消息中心发送的广告的答复,我必须确保该过程确实有效。 (我工作的公司是一家分类广告公司,主要处理广告。因此通过邮件回复广告)

– Faheem
2012年1月19日13:04

是的,您可以在数据库中保留一个简单的“ test_mails”表,其中包含诸如to,from,body,header等之类的字段,然后实现一个自定义的assert函数。当然,这是有限的,直到您的应用程序处于测试模式。如果您打算在生产模式下验证此功能,则需要其他类型的设置。

– Abhimanyu
2012年1月28日10:19



#5 楼

请记住您的摘录:
”但是,我已经考虑了一下,打算进行此操作的方法是实际上拥有一个“ tester GMail帐户”,然后使用“ tester account”凭据登录做一个简单的UI自动化技术,在该技术中,我将使用GMail的搜索功能来断言未读的电子邮件(主题),并在打开邮件后验证是否存在所有文本。并假设您对答案之一中提到的Google服务条款了如指掌并获得了/ got权限,并且想从UI中进行尝试,则可以在下面进行以下尝试: />在基本的HTML视图中登录到您的“ tester gmail acount”。
在“搜索框”中输入搜索词并进行搜索。
如果搜索结果中没有邮件,请退出:

/>当有未读邮件时(有一个CSS标识符可与已读邮件区分开):
打开邮件,并验证是否所有文本都存在。 >或者如果您不想与gmail UI交互并使用客户端(即IMAP),则这里有一些有用的东西,它是一个超集,可以很容易地进行调整,以解决此处关注的问题。

评论


您在响应中提供的链接是一颗宝石……它似乎确实是我一直在寻找的东西,我肯定会试一试:)。!*谢谢工厂的建议/建议,它非常有用赞赏。

– Faheem
2012年1月20日7:11



#6 楼

试用mailosaur.com它为您提供无限的测试电子邮件地址,并允许自动和手动测试电子邮件。

我们具有Java,.NET,Ruby,Python和Node.js绑定,可轻松将其集成到Selenium测试脚本中。

披露:我是一家-founder。

评论


非常好的api,虽然可以选择等待特定的电子邮件到达,而无需间隔获取api,这将是很好的...

– Marko
16年7月7日在18:55

现在,我们的最新客户可以做到:mailosaur.com/docs/email-testing/cypress/client-reference

– AndyD
20-10-23在0:38

#7 楼

尽管问题不在于该Web邮件的哪一部分是自动化的,但无论您遇到什么问题,最好的解决方案都是Selenium IDE。

如果您的测试涉及重复登录并将邮件发送给许多人,然后您可以将该插件安装到firefox,并开始记录测试,例如登录gmail并撰写和发送邮件。 in。

#8 楼

我只是用名为Inbucket(http://www.inbucket.org/)的工具替换了我们基于Gmail的测试,并只是查询其REST API来检查电子邮件内容。到目前为止,它运行良好。如果使用c#,则使用RestSharp创建一个小类来查询API非常简单。

#9 楼

GMail具有官方的JAVA API。这是您的书包:https://developers.google.com/gmail/api/quickstart/quickstart-java

#10 楼

这是我们在公司所做的事情:编写一个可通过IMAP与Gmail通讯的Web应用。 Webapp以易于Webdriver处理的形式显示您的收件箱或单独的消息。它还可以显示单个消息。

#11 楼

使用Javamail API读取Outlook和gmail的Java实现。以下是工作代码段:

public GmailUtils(String username, String password, String server, EmailFolder emailFolder) throws Exception {
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imap");
    props.setProperty("mail.imaps.partialfetch", "false");
    props.put("mail.imap.ssl.enable", "true");
    props.put("mail.mime.base64.ignoreerrors", "true");

    Session session = Session.getDefaultInstance(props, null);
    Store store = session.getStore("imap");
    store.connect("imap.gmail.com", 993, "<your email>", "<your password>");

    Folder folder = store.getFolder(emailFolder.getText());
    folder.open(Folder.READ_WRITE);

    System.out.println("Total Messages:" + folder.getMessageCount());
    System.out.println("Unread Messages:" + folder.getUnreadMessageCount());

    messages = folder.getMessages();

    for (Message mail : messages) {
        if (!mail.isSet(Flags.Flag.SEEN)) {

            System.out.println("***************************************************");
            System.out.println("MESSAGE : \n");

            System.out.println("Subject: " + mail.getSubject());
            System.out.println("From: " + mail.getFrom()[0]);
            System.out.println("To: " + mail.getAllRecipients()[0]);
            System.out.println("Date: " + mail.getReceivedDate());
            System.out.println("Size: " + mail.getSize());
            System.out.println("Flags: " + mail.getFlags());
            System.out.println("ContentType: " + mail.getContentType());                
            System.out.println("Body: \n" + getEmailBody(mail));
            System.out.println("Has Attachments: " + hasAttachments(mail));

        }
    }
}



public OutlookEmail(String username, String password, String server, EmailsFolder 
     inbox) throws Exception {
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imap");
    props.setProperty("mail.imap.ssl.enable", "true");
    props.setProperty("mail.imaps.partialfetch", "false");
    props.put("mail.mime.base64.ignoreerrors", "true");

    Session mailSession = Session.getInstance(props);
    mailSession.setDebug(true);
    Store store = mailSession.getStore("imap");
    store.connect("outlook.office365.com", "<your email>", "<your password>");


    Folder folder = store.getFolder("INBOX");
    folder.open(Folder.READ_WRITE);

    System.out.println("Total Message:" + folder.getMessageCount());
    System.out.println("Unread Message:" + folder.getUnreadMessageCount());

    messages = folder.getMessages();

    for (Message mail : messages) {
        if (!mail.isSet(Flags.Flag.SEEN)) {

            System.out.println("***************************************************");
            System.out.println("MESSAGE : \n");

            System.out.println("Subject: " + mail.getSubject());
            System.out.println("From: " + mail.getFrom()[0]);
            System.out.println("To: " + mail.getAllRecipients()[0]);
            System.out.println("Date: " + mail.getReceivedDate());
            System.out.println("Size: " + mail.getSize());
            System.out.println("Flags: " + mail.getFlags());
            System.out.println("ContentType: " + mail.getContentType());
            System.out.println("Body: \n" + getEmailBody(mail));
            System.out.println("Has Attachments: " + hasAttachments(mail));

        }
    }
}

public boolean hasAttachments(Message email) throws Exception {

    // suppose 'message' is an object of type Message
    String contentType = email.getContentType();
    System.out.println(contentType);

    if (contentType.toLowerCase().contains("multipart/mixed")) {
        // this message must contain attachment
        Multipart multiPart = (Multipart) email.getContent();

        for (int i = 0; i < multiPart.getCount(); i++) {
            MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
            if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
                System.out.println("Attached filename is:" + part.getFileName());

                MimeBodyPart mimeBodyPart = (MimeBodyPart) part;
                String fileName = mimeBodyPart.getFileName();

                String destFilePath = System.getProperty("user.dir") + "\Resources\";

                File fileToSave = new File(fileName);
                mimeBodyPart.saveFile(destFilePath + fileToSave);

                // download the pdf file in the resource folder to be read by PDFUTIL api.

                PDFUtil pdfUtil = new PDFUtil();
                String pdfContent = pdfUtil.getText(destFilePath + fileToSave);

                System.out.println("******---------------********");
                System.out.println("\n");
                System.out.println("Started reading the pdfContent of the attachment:==");


                System.out.println(pdfContent);

                System.out.println("\n");
                System.out.println("******---------------********");

                Path fileToDeletePath = Paths.get(destFilePath + fileToSave);
                Files.delete(fileToDeletePath);
            }
        }

        return true;
    }

    return false;
}

public String getEmailBody(Message email) throws IOException, MessagingException {

    String line, emailContentEncoded;
    StringBuffer bufferEmailContentEncoded = new StringBuffer();
    BufferedReader reader = new BufferedReader(new InputStreamReader(email.getInputStream()));
    while ((line = reader.readLine()) != null) {
        bufferEmailContentEncoded.append(line);
    }

    System.out.println("**************************************************");

    System.out.println(bufferEmailContentEncoded);

    System.out.println("**************************************************");

    emailContentEncoded = bufferEmailContentEncoded.toString();

    if (email.getContentType().toLowerCase().contains("multipart/related")) {

        emailContentEncoded = emailContentEncoded.substring(emailContentEncoded.indexOf("base64") + 6);
        emailContentEncoded = emailContentEncoded.substring(0, emailContentEncoded.indexOf("Content-Type") - 1);

        System.out.println(emailContentEncoded);

        String emailContentDecoded = new String(new Base64().decode(emailContentEncoded.toString().getBytes()));
        return emailContentDecoded;
    }

    return emailContentEncoded;

}