如何使用capybara访问电子邮件中的链接

Abh*_*sek 7 ruby testing selenium cucumber capybara

我是水豚黄瓜的新手.我有一个应用程序来测试其流程是:'在提交表单后,将向用户发送一封电子邮件,其中包含指向另一个应用程序的链接.为了访问应用程序,我们必须打开邮件并单击链接,该链接将重定向到应用程序.我无权访问邮件ID.有没有办法提取该链接并继续流程?请给出一些可行的方法.

此致,Abhisek Das

jma*_*bia 7

您可以使用 Nokogiri 解析电子邮件正文并找到您要单击的链接。

想象一下您想要单击一个链接“更改我的密码”

email = ActionMailer::Base.deliveries.last
html = Nokogiri::HTML(email.html_part.body.to_s)
target_url = html.at("a:contains('Change my password')")['href']
visit target_url
Run Code Online (Sandbox Code Playgroud)

我认为这比使用正则表达式更具语义性和鲁棒性。例如,如果电子邮件有很多链接,这就会起作用。


thi*_*ans 6

在测试中,使用您需要的任何方法来触发应用程序发送电子邮件.发送电子邮件后,使用正则表达式从电子邮件正文中的链接中查找URL(请注意,这仅适用于包含单个链接的电子邮件),然后访问Capybara中该URL的路径以继续你的考试:

path_regex = /(?:"https?\:\/\/.*?)(\/.*?)(?:")/    

email = ActionMailer::Base.deliveries.last
path = email.body.match(path_regex)[1]
visit(path)
Run Code Online (Sandbox Code Playgroud)


正则表达式解释

正则表达式(正则表达式)本身由正斜杠划分,并且该正则表达式特别由三个组组成,每个由括号对划分.第一组和第三组都以开头?:,表示它们是非捕获组,而第二组是捕获组(否?:).我将在下面解释这种区别的重要性.

第一组(?:"https?\:\/\/.*?)是:

  • 非捕获组, ?:
  • 匹配单个双引号, "
    • 我们匹配一个引用,因为我们预计URL将在href="..."链接标记的属性中
  • 后跟字符串 http
  • 可选地后跟小写s,s?
    • 问号使得前一个匹配,在这种情况下s,是可选的
  • 然后是冒号和两个正斜杠, \:\/\/
    • 注意反斜杠,它用于转义在正则表达式中具有特殊含义的字符
  • 后跟一个通配符,.*?它将匹配任何字符,直到达到正则表达式中的下一个匹配
    • 句点或通配符匹配任何字符
    • 星号,*重复前一个匹配,最多可以无限次,具体取决于后面的连续匹配
    • 问号使得这是一个懒惰的匹配,这意味着通配符将匹配尽可能少的字符,同时仍然允许正则表达式中的下一个匹配

第二组(\/.*?)是一个捕获组:

  • 匹配单个正斜杠, \/
    • 这将匹配URL的主机部分之后的第一个正斜杠(例如,结尾处http://www.example.com/的斜杠),因为斜杠http://已经与第一组匹配
  • 然后是另一个懒惰的通配符, .*?

第三组(?:")是:

  • 另一个非捕获组, ?:
  • 匹配单个双引号, "

因此,我们的第二组将匹配URL的部分,从主机后面的正斜杠开始,然后到达,但不包括我们结束时的双引号href="...".

当我们match使用正则表达式调用方法时,它返回一个实例MatchData,其行为与数组非常相似.index 0处的元素是一个包含整个匹配字符串的字符串(来自正则表达式中的所有组),而后续索引处的元素只包含正则表达式捕获组匹配的字符串部分(仅限我们的第二组,在这种情况下) ).因此,为了获得我们的第二组的相应匹配 - 这是我们想要使用Capybara访问的路径 - 我们在索引处获取元素1.