我不认为你可以用一组 id 配置测试库,参考API 配置,
import { configure } from '@testing-library/cypress'
configure({ testIdAttribute: 'id' })
但即使这样也失败了。相反,您必须使用 Cypress 命令来更改属性名称(只允许使用一个名称)。
cy.configureCypressTestingLibrary({ testIdAttribute: 'id' })
要使用任一/或属性名称,您可以动态更改属性名称,将其包装在自定义命令中(基于自定义查询)
Cypress.Commands.add('findByTestIdOrId', (idToFind) => {
let result;
const { queryHelpers } = require('@testing-library/dom');
let queryAllByTestId = queryHelpers.queryAllByAttribute.bind(null, 'data-testId');
result = queryAllByTestId(Cypress.$('body')[0], idToFind)
if (result.length) return result;
queryAllByTestId = queryHelpers.queryAllByAttribute.bind(null, 'id');
result = queryAllByTestId(Cypress.$('body')[0], idToFind);
if (result.length) return result;
throw `Unable to find an element by: [data-test-id="${idToFind}"] or [id="${idToFind}"]`
})
cy.findByTestIdOrId('my-id')
.should('have.attr', 'id', 'my-id')
// passes and logs "expected <div#my-id> to have attribute id with the value my-id"
请注意,此自定义命令仅适用于同步 DOM。
如果您需要 Cypress 重试并搜索其中一个/或属性,请不要在自定义命令中使用 testing-library。
而是使用赛普拉斯.should()
启用重试
Cypress.Commands.add('findByTestIdOrId', (selector, idToFind) => {
cy.get(selector)
.should('satisfy', $els => {
const attrs = [...$els].reduce((acc, el) => {
const id = el.id || el.getAttribute('data-test-id') // either/or attribute
if (id) {
acc.push(id)
}
return acc
}, [])
return attrs.some(attr => attr === idToFind); // retries when false
})
.first(); // may be more than one
})
cy.findByTestIdOrId('div', 'my-id')
.should('have.attr', 'id', 'my-id')
// passes and logs "expected <div#my-id> to have attribute id with the value my-id"