您可以使用 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)
我认为这比使用正则表达式更具语义性和鲁棒性。例如,如果电子邮件有很多链接,这就会起作用。
在测试中,使用您需要的任何方法来触发应用程序发送电子邮件.发送电子邮件后,使用正则表达式从电子邮件正文中的链接中查找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?\:\/\/.*?)
是:
?:
"
href="..."
链接标记的属性中http
s?
s
,是可选的\:\/\/
.*?
它将匹配任何字符,直到达到正则表达式中的下一个匹配
*
重复前一个匹配,最多可以无限次,具体取决于后面的连续匹配第二组(\/.*?)
是一个捕获组:
\/
http://www.example.com/
的斜杠),因为斜杠http://
已经与第一组匹配.*?
第三组(?:")
是:
?:
"
因此,我们的第二组将匹配URL的部分,从主机后面的正斜杠开始,然后到达,但不包括我们结束时的双引号href="..."
.
当我们match
使用正则表达式调用方法时,它返回一个实例MatchData
,其行为与数组非常相似.index 0
处的元素是一个包含整个匹配字符串的字符串(来自正则表达式中的所有组),而后续索引处的元素只包含正则表达式捕获组匹配的字符串部分(仅限我们的第二组,在这种情况下) ).因此,为了获得我们的第二组的相应匹配 - 这是我们想要使用Capybara访问的路径 - 我们在索引处获取元素1
.
归档时间: |
|
查看次数: |
1398 次 |
最近记录: |