柏树说
选项仅支持在Cypress.Commands.add()中使用,而不支持Cypress.Commands.overwrite()
所以当我们覆盖一个命令时,我们不能改变主题行为,我们不能添加一个与核心命令(链接)同名的新命令。
如何创建具有自定义行为和可选主题的find
命令.
(注意:我会取一个不同的名字,但我猜find
和get
是最可读的,已经是柏树的一部分)
// this is just an example of a custom find
Cypress.Commands.overwrite('find', (originalFn, selector, options) => {
return cy.log('my custom find')
})
cy.get('body').find('div') // OK
cy.find('div') // throws ERROR (I want this to be possible)
不确定你是否只是给出一个例子,但cy.find('div')
(如果它是有效的语法)相当于cy.get('div')
,因为get
总是从<body>
搜索。
find
存在的全部原因是从不同的元素中搜索,这是.within()
cy.get('my-parent-element').within(() => {
cy.get('my-child-element')
})
// is equivalent to
cy.get('my-parent-element').find('my-child-element')
一般情况下,如果你不使用typescript,你可以直接在options
参数中添加新的属性,并在overwrite中访问它们。
如果使用typescript,则需要修改类型定义以包含新选项。
你是正确的,你不能提供options
命令覆盖。
但是您可以用新的命令替换cy.find()
。
Cypress.Commands.add('find2',
{ prevSubject: ['optional', 'window', 'document', 'element'] },
(subject, selector, options) => {
const originalFn = Cypress.Commands._commands.find.fn;
if (subject) {
return originalFn(subject, selector, options)
} else {
cy.get('body').then($body => {
return originalFn($body, selector, options)
})
}
})
cy.find = cy.find2
cy.get('div').find('p') // ✅
cy.find('div') // ✅