pon*_*ous 3 javascript jquery cypress
我有以下代码:
cy.get('input:checkbox').first().as('firstCheckbox').then(() => {
cy.get('@firstCheckbox').should('be.checked').click()
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('be.visible')
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('not.exist')
cy.get('@firstCheckbox').should('not.be.checked').click()
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('be.visible')
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('not.exist')
cy.get('@firstCheckbox').should('be.checked')
})
Run Code Online (Sandbox Code Playgroud)
cy.get('@firstCheckbox').should('be.checked').click()
将复选框移动到最后一个索引位置而不是第一个索引位置后。根据我对别名的理解,这应该不重要,因为我引用它并且('@')
它在哪个位置并不重要。不幸的是,下一个cy.get('@firstCheckbox')
访问新的第一个元素,而不是我最初引用的元素。我也无法从文档中弄清楚。错误在哪里?
https://docs.cypress.io/guides/core-concepts/variables-and-aliases
https://docs.cypress.io/api/commands/as
@agoff 的更新:
它似乎更适合您的代码,但我注意到新代码存在一个新问题。如果您取消选中该复选框,则该类将使用 js 重新加载,导致它短暂地从 dom 中消失。之后它就找不到它了,测试中止。我也尝试过重新加载,但它再也找不到该元素了。这该如何处理呢?
选中的复选框类的名称为custom-control-input ng-untouched ng-pristine ng-valid
。取消选中类名后更改为custom-control-input.ng-untouched.ng-valid.ng-dirty
一秒钟,然后元素被删除并使用类名重新加载到 DOM 中custom-control-input ng-untouched ng-pristine ng-valid
。问题在于,尽管搜索并找到了具有该类的初始cy.wrap($el)
元素,但第二个元素仍尝试查找该元素。这是我不明白的另一件事。custom-control-input.ng-untouched.ng-valid.ng-dirty
custom-control-input ng-untouched ng-pristine ng-valid
如果在单击事件期间应用程序删除输入并在末尾添加一个新输入,则会发生这种情况。那么你的别名就无效了,因为它指向的元素不再存在于 DOM 中。
如果我在点击处理程序中移动元素,您的代码就会起作用。
如果我在单击处理程序中克隆该元素,您的代码将失败。
该怎么办?
单击()后刷新您的别名
cy.get('input:checkbox').first().as('myCheckbox').then(() => {
cy.get('@myCheckbox').should('be.checked').click()
.then(() => cy.get('input:checkbox').last().as('myCheckbox')) // it's last now!
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('be.visible')
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('not.exist')
cy.get('@myCheckbox').should('not.be.checked').click()
.then(() => cy.get('input:checkbox').last().as('myCheckbox'))
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('be.visible')
cy.get('.globalMessage-display > :nth-child(1) > .alert').should('not.exist')
cy.get('@myCheckbox').should('be.checked')
})
Run Code Online (Sandbox Code Playgroud)
alias 命令还有另一个技巧。
如果元素被克隆和替换,原始元素就会从 DOM 中分离。
检测cy.get('@alias')
分离的元素并重播原始命令以自动刷新。
它不起作用,.first()
因为元素改变了位置。
但如果您使用data-cy
属性而不是.first()
,您的代码将起作用。
cy.get('input:checkbox[data-cy="first-checkbox"]')
.as('myCheckbox').then(() => {
cy.get('@myCheckbox')
.should('be.checked').click() // cloned and moved to another position
...
cy.get('@myCheckbox') // detached by previous click
.should('not.be.checked').click() // so alias replays original get
// with [data-cy="first-checkbox"]
...
cy.get('@myCheckbox').should('be.checked') // as above
})
Run Code Online (Sandbox Code Playgroud)
这是执行此操作的 Cypress 代码
let { subject, alias, command } = aliasObj
const resolveAlias = () => {
if ($dom.isElement(subject)) { // if this is a DOM element
const replay = () => {
cy.replayCommandsFrom(command)
return undefined
}
if ($dom.isDetached(subject)) { // is it detached?
subject = subject.filter((index, el) => $dom.isAttached(el)) // all detached?
if (!subject.length) {
return replay() // perform the replay
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2350 次 |
最近记录: |