尽管页面加载正常,但删除目标属性后,Cypress 似乎无法获取 URL 值

问题描述 投票:0回答:1

我希望赛普拉斯通过单击链接并查看 URL 是否包含特定字符串来检查页面链接是否正确。

为此,我创建了该函数:

checkLink = (linkEl, expectedPath) => {
    let pathString = linkEl.prop('href') ? linkEl.prop('href') : 'no-href';
    if (expectedPath && (pathString != 'no-href')) {
        cy.task('log', 'Checking link: '  + pathString + ' ' + expectedPath);
        cy.get(linkEl).click();
        cy.url().should('include', expectedPath);
        cy.go('back');
    }
}

对于大多数情况,这工作得很好。

但是,如果链接具有

target="_blank"
属性,则该链接将不起作用。所以我添加了
.invoke('removeAttr', 'target')
并将函数更改为以下内容:

checkLink = (linkEl, expectedPath) => {
    let pathString = linkEl.prop('href') ? linkEl.prop('href') : 'no-href';
    if (expectedPath && (pathString != 'no-href')) {
        cy.task('log', 'Checking link: '  + pathString + ' ' + expectedPath);
        cy.get(linkEl).invoke('removeAttr', 'target').click();
        cy.url().should('include', expectedPath);
        cy.go('back');
    }
}

但是,现在似乎无法获取其访问的页面的URL。例如我收到错误:

 AssertionError: Timed out retrying after 4000ms: expected '' to include 'mystring'

如果我按标题运行测试,我可以看到页面(URL 中包含预期的字符串)加载良好。出于某种原因,Cypress 似乎不再从

cy.url()
得到任何东西。

有人知道这是为什么吗?

javascript node.js automated-tests cypress
1个回答
0
投票

Cypress 不支持在一次测试中访问多个页面。要在单击后检查链接的 URL,您必须在

cy.origin()
命令中执行此操作。

const checkLink = (linkEl, expectedPath) => {
  if (!expectedPath || !linkEl.attr('href')) return

  cy.wrap(linkEl).invoke('removeAttr', 'target')
  cy.wrap(linkEl).click()

  cy.origin(expectedPath, { args: { expectedPath } }, ({expectedPath}) => {
    cy.url().should('include', expectedPath)
    cy.go('back')
  })
}

cy.get('a#1').then($a => {
  checkLink($a, 'https://example.com/')
})

这记录了通过的测试:

enter image description here

它也适用于

target="_blank"
链接。

这是我的两个链接,都有效

<a id="1" href="https://example.com">Example</a>
<a id="2" target="_blank" href="https://example.com">Example</a>
© www.soinside.com 2019 - 2024. All rights reserved.