waitUntilScrollingFinished.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. export function waitUntilScrollingFinished(selector: string, start = -1) {
  2. const pollSlow = 100
  3. const pollFast = 10
  4. const deadline =
  5. performance.now() + Cypress.config('defaultCommandTimeout') - pollSlow * 2
  6. return cy.get(selector).then(el => {
  7. cy.log(
  8. `waiting until scrolling finished for ${selector}, starting from ${start}`
  9. )
  10. return new Cypress.Promise<number>((resolve, reject) => {
  11. const waitForStable = (prev: number, stableFor: number) => {
  12. if (performance.now() > deadline) {
  13. return reject(new Error('timeout waiting for scrolling to finish'))
  14. }
  15. const current = el.scrollTop()!
  16. if (current !== prev) {
  17. setTimeout(() => waitForStable(current, 0), pollFast)
  18. } else if (stableFor < 5) {
  19. setTimeout(() => waitForStable(current, stableFor + 1), pollFast)
  20. } else {
  21. resolve(current)
  22. }
  23. }
  24. const waitForChange = () => {
  25. if (performance.now() > deadline) {
  26. return reject(new Error('timeout waiting for scrolling to start'))
  27. }
  28. const current = el.scrollTop()!
  29. if (current === start) {
  30. setTimeout(() => waitForChange(), pollSlow)
  31. } else {
  32. setTimeout(() => waitForStable(current, 0), pollFast)
  33. }
  34. }
  35. waitForChange()
  36. })
  37. })
  38. }