【问题标题】:Selenium Webdriver automation with emailsSelenium Webdriver 自动化与电子邮件
【发布时间】:2014-04-07 14:56:17
【问题描述】:

我目前正在尝试使用 Selenium Webdriver (C#) 自动化忘记密码 -> 重置密码工作流程,用户导航到页面并提供他们的用户名,后端代码验证用户名,然后发送电子邮件带有指向与其帐户关联的电子邮件地址的重置密码链接。

我能够在代码发送电子邮件之前自动执行该过程,但我不知道任何检查电子邮件和/或单击电子邮件中的链接的方法,所以我希望有人对 Selenium/自动化更有经验的人可能会给我一些指点。

理想情况下,测试不应该关心电子邮件被发送到的电子邮件地址。 Selenium WebDriver 或某些 3rd 方包是否有办法捕获正在发送的电子邮件?

感谢您的任何意见或建议。

【问题讨论】:

  • 这个测试应该证明什么?应用程序只能向某人发送电子邮件,它不能确保用户实际收到电子邮件。因此,您的测试也不能。
  • 只是想要一个端到端的测试来验证用户是否可以点击忘记密码并使用电子邮件中提供的链接重置他们的密码。不过我明白你的意思,谢谢。
  • 也许一种解决方法是将电子邮件转储到本地或某些存储中。例如,修改应用程序以将电子邮件转储到数据库或本地文件,然后然后发送电子邮件?然后,您可以在 .NET 中的 SMTP 客户端发送电子邮件之前接收电子邮件。然后,这将在您当前的解决方案中保存不必要的 SMTP 查询(您在下面的答案的评论中提到)

标签: c# email selenium selenium-webdriver


【解决方案1】:

没有。您正在谈论设置电子邮件服务器,这不是一件容易的事。

您应该将它发送到测试工作电子邮件(如果这是给公司)或公共电子邮件(hotmail/gmail),或者如果安全性根本不是问题,最简单的发送位置是一次性电子邮件(邮寄者)

【讨论】:

  • 我希望使用一些魔法来捕获所有外发电子邮件“网络”来简化和避免使用 3rd 方 nuget 包查询邮箱的必要性。我使用测试工作电子邮件路由并使用 MailSystem.Net 查询它。工作得很好。感谢您的信息。
  • 您实际上可以设置一个简单的桌面电子邮件服务器用于测试。有几个可用的,一个例子是papercut
  • 谢谢!我会看看那个。
  • @Faiz 太棒了。我查看了网页...如果另一台计算机上的应用程序尝试向它发送电子邮件,您会将其发送到 IP 地址吗?
  • @NathanMerrill - 应该可以。将IP地址设置为Options中的机器IP地址;虽然没有尝试过。您也可以使用 hMailServer 之类的东西来获得更持久的解决方案。
【解决方案2】:

你可以试试PutsBox。您可以发送电子邮件至whatever-you-want@putsbox.com,等待几秒钟(SMTP 内容不是即时的),然后通过http://preview.putsbox.com/p/whatever-you-want/last 查看您的电子邮件。

看看这个post tutorial,它可以给你一些想法。

【讨论】:

    【解决方案3】:

    Selenium 没有与 Thunderbird/Outlook 等电子邮件客户端集成。但是,如果您有同一个电子邮件客户端的 Web 界面,那么您可以从浏览器访问电子邮件,并使用 selenium 阅读和回复电子邮件。我最近尝试过这个,它在我使用 web Outlook 进行测试的地方运行良好。 希望这会有所帮助。

    【讨论】:

    • 虽然这确实有效,但您变得依赖于邮件应用程序的界面。如果他们更新并更改界面,您将不得不更新您的测试以进行未引入的更改。不过值得一看。
    【解决方案4】:

    您好,我遇到了类似的情况,并且能够成功实施一种方法来获取激活或忘记密码链接。

    使用 Java Mail API,我能够在执行此类操作时触发一个方法,该方法进入文件夹并读取特定消息行,然后获取链接并使用 WebDriver 在浏览器中打开它。

    但是,这样做的主要缺点是读取特定文件夹的不一致,有时电子邮件会进入垃圾邮件或其他文件夹(如果 Gmail 是新的社交文件夹),使其不可见或难以检索。

    总的来说,我认为这是一个不应该真正自动化的过程,在测试方面,它应该通过模拟响应来完成更多的代码基础级别。 下面的片段应该让您了解如何实施

    public class RefactoredMail {
    
     public static void main(String[] args) {
            Properties props = new Properties();
            props.setProperty("mail.store.protocol", "imaps");
            try {
                Session session = Session.getInstance(props, null);
                Store store = session.getStore();
                store.connect("imap.gmail.com", "username", "password");
                Folder inbox = store.getFolder("INBOX");
                inbox.open(Folder.READ_ONLY);
                Message msg = inbox.getMessage(inbox.getMessageCount());
                Address[] in = msg.getFrom();
                for (Address address : in) {
                    System.out.println("FROM:" + address.toString());
                }
    
                Multipart mp = (Multipart) msg.getContent();
                BodyPart bp = mp.getBodyPart(0);
                System.out.println("SENT DATE:" + msg.getSentDate());
                System.out.println("SUBJECT:" + msg.getSubject());
                System.out.println("CONTENT:" + bp.getContent());
    
           System.out.println("Activation Link:" + ((String) 
           bp.getContent()).startsWith("http"));
    
                String [] line =  new String[1];
    
                line [0] = mp.getContentType().toString();
                System.out.println("Activation Link:" + (mp.getBodyPart(0).getLineCount()));
    
                System.out.println("Activation Link:" +line[0]);
    
    
            } catch (Exception e) {
                e.printStackTrace();
            } 
     //WebDriver Stuffs
     public String activationUrl() {
    //getting the url link and making it a global variable .... etc
        //Accessing the link 
     }  
        }
    

    【讨论】:

    • 我同意依赖浏览器实现电子邮件客户端的观点并不好,这就是为什么我正在寻找一种更 API 的方法来查询邮件服务器。感谢您的意见。
    【解决方案5】:

    您可以使用https://github.com/cmendible/netDumbsterhttp://ndumbster.sourceforge.net/default.html。我用过一个忘记是哪个了。这将托管一个 smtp 侦听器,并允许您针对它收到的任何电子邮件做出断言。真是太棒了!需要注意的是,您需要能够控制服务器在您正在测试的环境中传递邮件的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多