Comments (5)
Here's the solution, you can find it this repository of mine. You do not need to use cy.waitUntil
but I've added two tests, one with Cypress' built-in utilities and one with cy.waitUntil
.
Common part:
let mutationsHistory
beforeEach(() => {
cy.visit('/')
mutationsHistory = []
cy.get('#some-id').then(($targetNode) => {
const observer = new MutationObserver((mutationsList) => mutationsHistory.push(mutationsList))
observer.observe($targetNode[0], { childList: true })
})
})
leveraging the MutationObserver API, Cypress records all the mutations in the mutationsList
array.
Cypress built-in solution
This simple script waits until the mutations array contains something
cy.wrap(mutationsHistory)
.should('have.length.greaterThan', 0)
With cy.waitUntil:
The same of the above code but with cy.waitUntil
cy.waitUntil(() => mutationsHistory.length)
Always opt for the built-in solution if you can š
This is the full code of the test
/// <reference types="Cypress" />
context('DOM change detection', () => {
let mutationsHistory
beforeEach(() => {
cy.visit('/')
mutationsHistory = []
cy.get('#some-id').then(($targetNode) => {
const observer = new MutationObserver((mutationsList) => mutationsHistory.push(mutationsList))
observer.observe($targetNode[0], { childList: true })
})
})
it('Should detect the DOM change', () => {
cy.contains('Mutate after a random delay').click()
cy.wrap(mutationsHistory)
.should('have.length.greaterThan', 0)
.then((mutationsHistory) => {
cy.log('Now you can do whatever you want with `mutationsHistory`')
console.log(mutationsHistory)
})
})
it('Should detect the DOM change with cy.waitUntil', () => {
cy.contains('Mutate after a random delay').click()
cy.waitUntil(() => (mutationsHistory.length ? mutationsHistory : false)).then(
(mutationsHistory) => {
cy.log('Now you can do whatever you want with `mutationsHistory`')
console.log(mutationsHistory)
}
)
})
})
I hope it helps š
from cypress-wait-until.
Hi @Wulfheart
How can I detect a status change in the
element
What do you mean by "status change"? A change in the children? A change in the attributes?
Is there anything that allows you to be completely sure that something changed? I guess that you have SSR and re-hydration in browserland? Timestamps could be a good idea.
Anyway: before speaking about how to use cy.waitUntil
to detect a change we need to clarify how to detect a change at all, that's why I'm asking above š
from cypress-wait-until.
@NoriSte thanks for your quick response. Generally speaking Iād like to detect a DOM change in a specific container.
from cypress-wait-until.
Tomorrow I could add a more complete answer, meanwhile take a look at MutationObserver.
from cypress-wait-until.
Thank you for this extensive solution.
from cypress-wait-until.
Related Issues (20)
- Great use of wait-until if you have detached dom problems HOT 1
- Document Promise.reject() as anti-pattern HOT 3
- Timed out retrying after 4000ms: Expected to find element HOT 2
- Global timeout HOT 3
- Overwrite WaitUntil command HOT 3
- Cypress throw an error when returning `true` inside the cy.waitUntil callback HOT 4
- Example/Document Request: How to catch 'errorMsg' if cy.waitUntil() exceeds 'timeout'? HOT 1
- How to write test code about progess bar by waituntil HOT 3
- Wait for DOM change in order to assert completion of a job HOT 3
- Element is never found when timeout options are overrided HOT 5
- Update plugin to be compatible with Cypress 10 HOT 4
- feature request: use config file to set default timeout HOT 2
- Question: can I waitUntil multiple elements appear? HOT 2
- Cypress configuration error HOT 3
- Using cy.reload() - Failed because you are mixing up async and sync code. HOT 5
- Not working on the latest cypress version HOT 5
- Timeout can take longer than defined HOT 6
- allow node 16 HOT 5
- Is version 2.0.1 compatible with cypress 10? HOT 3
- Problem with TypeScript signature HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
š Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ššš
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ā¤ļø Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cypress-wait-until.