【问题标题】:Cypress click on link in mailhog body emailCypress 单击 mailhog 正文电子邮件中的链接
【发布时间】:2022-11-25 15:26:53
【问题描述】:

我需要有关使用柏树测试 mailhog 的帮助。

我正在尝试点击电子邮件正文中的“忘记密码”链接,请问如何操作?

【问题讨论】:

  • 请分享您的应用程序的 HTML。

标签: cypress domparser mailhog


【解决方案1】:

假设您有一个基于 HTML 的 Web 应用程序,您可以直接使用文本来查找并单击该元素。

cy.contains('Forgot password').click()

【讨论】:

  • 谢谢你的回答。但问题是我正在获取电子邮件正文(其类型表示它是一个字符串)但可以是 MIME,不确定。这就是我获取所有电子邮件并检查主题是否为“重置密码”的方式,然后我想解析正文以获取链接。但拆分对我不起作用,我也尝试通过正则表达式匹配它,但不确定是否是 mail hog有一些方法可以复制链接而不是在 Cypress 中访问它。我希望我说得更清楚一点: cy.mhGetAllMails().mhFirst().mhGetBody().should('contain', 'Hello') cy.mhGetAllMails ().mhFirst().mhGetBody().then(body => { })
  • 你能做到这一点并分享记录的内容吗cy.mhGetAllMails().mhFirst().mhGetBody().then(body => {cy.log(body)})
【解决方案2】:

您可以解析正文字符串以获取链接,但这会很混乱。

最好使用DOMParser

cy.mhGetAllMails().mhFirst().mhGetBody().then(body => {

  const parser = new DOMParser();
  const doc = parser.parseFromString(body, 'text/html')  // make a DOM 

  const anchor = doc.querySelector('a')                  // look for anchor tag
  const href = anchor.href                               // get the link

  cy.visit(href)                                         // visit the link
})

笔记

您不能直接单击带有.click() 的链接,因为上面创建的 DOM 不是附加到 Cypress 的实时 DOM。但是你应该可以 cy.visit(href) 做同样的事情。

我预见到的唯一问题是 cross-origin 错误 - 如果你得到它,请使用 cy.origin() 命令 Ref


如果您需要有关cy.origin() 电子邮件正文用法的更多详细信息,请参阅@Mr.PrasadJ 问题How to access new tab by clicking on "href"

【讨论】:

    【解决方案3】:

    就我而言,解析正文不起作用(我无法查询我的 a 标签)。我使用正则表达式来检索我的链接,然后单击它。

    在邮件正文中,我的链接如下所示: <a href="mydomain/verify/fXxo4s_isP-mlm">Verify account</a>

    但是在 cy.mhGetAllMails().mhFirst().mhGetBody().then(body => {cy.log(body)}) 的日志中,它被随机数 = 融化了,因为它没有被解析......

    对我来说可行的解决方案是用接受这些字符的模式提取匹配项,然后将其删除。最后重建链接以访问它:

    cy.mhGetAllMails().mhFirst().mhGetBody().then(content => {
        let token = content.match('verify/([A-Za-z0-9=~_\r\n-]+)<')[1];
        token = token.replace(/(
    |=)/gm, "");
        cy.visit('/verify/' + token);
    })
    

    也许不是更清洁的解决方案,但我希望它能有所帮助

    【讨论】: