我希望赛普拉斯通过单击链接并查看 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()
得到任何东西。
有人知道这是为什么吗?
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/')
})
这记录了通过的测试:
它也适用于
target="_blank"
链接。
这是我的两个链接,都有效
<a id="1" href="https://example.com">Example</a>
<a id="2" target="_blank" href="https://example.com">Example</a>