UNPKG

@revoloo/cypress6

Version:

Cypress.io end to end testing tool

836 lines (765 loc) 29.2 kB
describe('src/cy/commands/traversals - shadow dom', () => { beforeEach(() => { cy.visit('/fixtures/shadow-dom.html') }) context('#closest', () => { it('retrieves itself when it is the closest matching element within shadow dom', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .closest('p') .then(($parent) => { expect($parent.length).to.eq(1) expect($parent[0]).to.have.class('shadow-3') }) }) it('retrieves the closest element beyond shadow boundaries', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .closest('#parent-of-shadow-container-0') .then(($parent) => { expect($parent.length).to.eq(1) expect($parent[0]).to.have.id('parent-of-shadow-container-0') }) }) it('retrieves closest elements normally when no shadow roots', () => { cy .get('#shadow-element-3') .closest('#parent-of-shadow-container-0') .then(($parent) => { expect($parent.length).to.eq(1) expect($parent[0]).to.have.id('parent-of-shadow-container-0') }) }) it('retrieves closest element when element is the shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .closest('#shadow-element-3') .then(($parent) => { expect($parent.length).to.eq(1) expect($parent[0]).to.have.id('shadow-element-3') }) }) it('retrieves closest element when element is within the same shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .closest('div') .then(($parent) => { expect($parent.length).to.eq(1) expect($parent[0]).to.have.class('shadow-div') }) }) it('retrieves closest element when element is a nested shadow root parent', () => { cy .get('#shadow-element-5') .find('p', { includeShadowDom: true }) .closest('#shadow-element-4') .then(($parent) => { expect($parent.length).to.eq(1) expect($parent[0]).to.have.id('shadow-element-4') }) }) it('handles multiple elements in subject when parents are different', () => { cy .get('#shadow-element-1, #shadow-element-2') .find('div', { includeShadowDom: true }) .closest('cy-test-element') .then(($parents) => { expect($parents.length).to.eq(2) expect($parents[0]).to.have.id('shadow-element-1') expect($parents[1]).to.have.id('shadow-element-2') }) }) it('handles multiple elements in subject when parents are same', () => { cy .get('#shadow-element-9') .find('.shadow-div', { includeShadowDom: true }) .closest('cy-test-element') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('shadow-element-9') }) }) }) context('#find', () => { it('retrieves a matching element beyond shadow boundaries', () => { const el = cy.$$('#shadow-element-3')[0].shadowRoot.querySelector('p') cy .get('#parent-of-shadow-container-0') .find('p', { includeShadowDom: true }) .then(($element) => { expect($element.length).to.eq(1) expect($element[0]).to.eq(el) }) }) it('retrieves a matching element when no shadow roots', () => { const el = cy.$$('#shadow-element-3')[0] cy .get('#parent-of-shadow-container-0') .find('#shadow-element-3', { includeShadowDom: true }) .then(($element) => { expect($element.length).to.eq(1) expect($element[0]).to.eq(el) }) }) it('allows traversal when already within a shadow root', () => { const el = cy.$$('#shadow-element-3')[0].shadowRoot.querySelector('p') cy .get('#shadow-element-3') .shadow() .find('p') .then(($element) => { expect($element.length).to.eq(1) expect($element[0]).to.eq(el) }) }) // https://github.com/cypress-io/cypress/issues/7676 it('does not error when querySelectorAll is wrapped and snapshots are off', () => { cy.visit('/fixtures/shadow-dom.html?wrap-qsa=true') cy.get('#shadow-element-1').find('.shadow-1', { includeShadowDom: true }) }) describe('non-command options', () => { describe('suite-level config', { includeShadowDom: true }, () => { beforeEach(() => { cy .get('#parent-of-shadow-container-0') .find('.shadow-div') }) it('queries shadow dom', () => { cy .get('#parent-of-shadow-container-0') .find('.shadow-div') }) it('also queries shadow dom', () => { cy .get('#parent-of-shadow-container-0') .find('.shadow-div') }) }) describe('test-level config', () => { it('queries shadow dom', { includeShadowDom: true }, () => { cy .get('#parent-of-shadow-container-0') .find('.shadow-div') }) it('does not find element without option set', () => { cy .get('#parent-of-shadow-container-0') .find('.shadow-div').should('not.exist') }) }) describe('Cypress.config()', () => { const reset = () => { Cypress.config('includeShadowDom', false) } beforeEach(reset) afterEach(reset) it('turns option on and off at will', () => { cy.get('.shadow-div').should('not.exist').then(() => { Cypress.config('includeShadowDom', true) }) cy.get('.shadow-div') }) it('overrides test-level option being true', { includeShadowDom: true }, () => { Cypress.config('includeShadowDom', false) cy.get('.shadow-div').should('not.exist') }) it('overrides test-level option being false', { includeShadowDom: false }, () => { Cypress.config('includeShadowDom', true) cy.get('.shadow-div') }) }) }) }) context('#parent', () => { it('retrieves parent within shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parent() .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.class('shadow-div') }) }) it('retrieves parent by selector within shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parent('.shadow-div') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.class('shadow-div') }) }) it('retrieves parent when parent is shadow root', () => { cy .get('#shadow-element-3') .find('div', { includeShadowDom: true }) .parent() .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('shadow-element-3') }) }) it('retrieves parent by selector when parent is shadow root', () => { cy .get('#shadow-element-3') .find('div', { includeShadowDom: true }) .parent('#shadow-element-3') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('shadow-element-3') }) }) it('retrieves parent when element is shadow root', () => { cy .get('#shadow-element-3') .parent() .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) it('retrieves parent by selector when element is shadow root', () => { cy .get('#shadow-element-3') .parent('#parent-of-shadow-container-1') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) it('handles multiple elements in subject when parents are different', () => { cy .get('#shadow-element-1, #shadow-element-2') .find('div', { includeShadowDom: true }) .parent() .then(($parents) => { expect($parents.length).to.eq(2) expect($parents[0]).to.have.id('shadow-element-1') expect($parents[1]).to.have.id('shadow-element-2') }) }) it('handles multiple elements in subject when parents are same', () => { cy .get('#shadow-element-9') .find('.shadow-div', { includeShadowDom: true }) .parent() .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('shadow-element-9') }) }) }) context('#parents', () => { describe('parents()', () => { it('retrieves all parents, including those beyond shadow boundaries', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parents() .then(($parents) => { expect($parents.length).to.eq(6) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.match('body') expect($parents[5]).to.match('html') }) }) it('retrieves parents normally when no shadow roots exist', () => { cy .get('#shadow-element-3') .parents() .then(($parents) => { expect($parents.length).to.eq(4) expect($parents[0]).to.have.id('parent-of-shadow-container-1') expect($parents[1]).to.have.id('parent-of-shadow-container-0') expect($parents[2]).to.match('body') expect($parents[3]).to.match('html') }) }) it('handles multiple elements in subject', () => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parents() .then(($parents) => { expect($parents.length).to.eq(10) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.have.class('shadow-div') expect($parents[5]).to.have.id('shadow-element-8') expect($parents[6]).to.have.id('parent-of-shadow-container-3') expect($parents[7]).to.have.id('parent-of-shadow-container-2') expect($parents[8]).to.match('body') expect($parents[9]).to.match('html') }) }) }) describe('parents(selector) - ', () => { it('retrieves parents by selector within shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parents('.shadow-div') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.class('shadow-div') }) }) it('retrieves parents by selector within and outside of shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parents('div') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('parent-of-shadow-container-1') expect($parents[2]).to.have.id('parent-of-shadow-container-0') }) }) it('retrieves parents by selector outside of shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parents('#parent-of-shadow-container-0') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-0') }) }) it('handles multiple elements in subject', () => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parents('.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.id('parent-of-shadow-container-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) }) }) context('#parentsUntil', () => { describe('parentsUntil()', () => { it('retrieves all parents, including those beyond shadow boundaries', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parentsUntil() .then(($parents) => { expect($parents.length).to.eq(6) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.match('body') expect($parents[5]).to.match('html') }) }) it('retrieves parents normally when no shadow roots exist', () => { cy .get('#shadow-element-3') .parentsUntil() .then(($parents) => { expect($parents.length).to.eq(4) expect($parents[0]).to.have.id('parent-of-shadow-container-1') expect($parents[1]).to.have.id('parent-of-shadow-container-0') expect($parents[2]).to.match('body') expect($parents[3]).to.match('html') }) }) it('handles multiple elements in subject', () => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil() .then(($parents) => { expect($parents.length).to.eq(10) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.have.class('shadow-div') expect($parents[5]).to.have.id('shadow-element-8') expect($parents[6]).to.have.id('parent-of-shadow-container-3') expect($parents[7]).to.have.id('parent-of-shadow-container-2') expect($parents[8]).to.match('body') expect($parents[9]).to.match('html') }) }) }) describe('parentsUntil(selector)', () => { it('retrieves parents until selector within shadow root', () => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil('.shadow-div') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-8-nested-2') expect($parents[1]).to.have.class('shadow-8-nested-1') expect($parents[2]).to.have.class('shadow-content') }) }) it('retrieves parents until selector within and outside of shadow root', () => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parentsUntil('#parent-of-shadow-container-0') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') }) }) it('retrieves parents until selector normally when no shadow roots exist', () => { cy .get('#shadow-element-3') .parentsUntil('#parent-of-shadow-container-0') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) it('handles multiple elements in subject', () => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil('body') .then(($parents) => { expect($parents.length).to.eq(8) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.have.class('shadow-div') expect($parents[5]).to.have.id('shadow-element-8') expect($parents[6]).to.have.id('parent-of-shadow-container-3') expect($parents[7]).to.have.id('parent-of-shadow-container-2') }) }) }) describe('parentsUntil(selector, filter)', () => { it('retrieves parents until selector within shadow root and filters result', () => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil('.shadow-div', '.filter-me') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.class('shadow-8-nested-1') }) }) it('retrieves parents until selector within and outside of shadow root and filters result', () => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil('#parent-of-shadow-container-0', '.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-8-nested-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) it('retrieves parents until selector normally when no shadow roots exist and filters result', () => { cy .get('#shadow-element-3') .parentsUntil('body', '.filter-me') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) it('handles multiple elements in subject', () => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil('html', '.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.id('parent-of-shadow-container-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) }) describe('parentsUntil(element)', () => { it('retrieves parents until element within shadow root', () => { cy .get('#shadow-element-8') .find('.shadow-div', { includeShadowDom: true }) .then(($untilEl) => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil($untilEl[0]) .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-8-nested-2') expect($parents[1]).to.have.class('shadow-8-nested-1') expect($parents[2]).to.have.class('shadow-content') }) }) }) it('retrieves parents until element within and outside of shadow root', () => { cy .get('#parent-of-shadow-container-0') .then(($untilEl) => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parentsUntil($untilEl[0]) .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') }) }) }) it('retrieves parents until element normally when no shadow roots exist', () => { cy .get('#parent-of-shadow-container-0') .then(($untilEl) => { cy .get('#shadow-element-3') .parentsUntil($untilEl[0]) .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) }) it('handles multiple elements in subject', () => { cy .get('html') .then(($untilEl) => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil($untilEl[0]) .then(($parents) => { expect($parents.length).to.eq(9) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.have.class('shadow-div') expect($parents[5]).to.have.id('shadow-element-8') expect($parents[6]).to.have.id('parent-of-shadow-container-3') expect($parents[7]).to.have.id('parent-of-shadow-container-2') expect($parents[8]).to.match('body') }) }) }) }) describe('parentsUntil(element, filter)', () => { it('retrieves parents until element within shadow root and filters result', () => { cy .get('#shadow-element-8') .find('.shadow-div', { includeShadowDom: true }) .then(($untilEl) => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil($untilEl[0], '.filter-me') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.class('shadow-8-nested-1') }) }) }) it('retrieves parents until element within and outside of shadow root and filters result', () => { cy .get('#parent-of-shadow-container-0') .then(($untilEl) => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil($untilEl[0], '.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-8-nested-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) }) it('retrieves parents until element normally when no shadow roots exist and filters result', () => { cy .get('body') .then(($untilEl) => { cy .get('#shadow-element-3') .parentsUntil($untilEl[0], '.filter-me') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) }) it('handles multiple elements in subject', () => { cy .get('html') .then(($untilEl) => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil($untilEl[0], '.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.id('parent-of-shadow-container-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) }) }) describe('parentsUntil(jQueryElement)', () => { it('retrieves parents until jquery element within shadow root', () => { cy .get('#shadow-element-8') .find('.shadow-div', { includeShadowDom: true }) .then(($untilEl) => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil($untilEl) .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-8-nested-2') expect($parents[1]).to.have.class('shadow-8-nested-1') expect($parents[2]).to.have.class('shadow-content') }) }) }) it('retrieves parents until jquery element within and outside of shadow root', () => { cy .get('#parent-of-shadow-container-0') .then(($untilEl) => { cy .get('#shadow-element-3') .find('p', { includeShadowDom: true }) .parentsUntil($untilEl) .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') }) }) }) it('retrieves parents until jquery element normally when no shadow roots exist', () => { cy .get('#parent-of-shadow-container-0') .then(($untilEl) => { cy .get('#shadow-element-3') .parentsUntil($untilEl) .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) }) it('handles multiple elements in subject', () => { cy .get('html') .then(($untilEl) => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil($untilEl) .then(($parents) => { expect($parents.length).to.eq(9) expect($parents[0]).to.have.class('shadow-div') expect($parents[1]).to.have.id('shadow-element-3') expect($parents[2]).to.have.id('parent-of-shadow-container-1') expect($parents[3]).to.have.id('parent-of-shadow-container-0') expect($parents[4]).to.have.class('shadow-div') expect($parents[5]).to.have.id('shadow-element-8') expect($parents[6]).to.have.id('parent-of-shadow-container-3') expect($parents[7]).to.have.id('parent-of-shadow-container-2') expect($parents[8]).to.match('body') }) }) }) }) describe('parentsUntil(jQueryElement, filter)', () => { it('retrieves parents until jquery element within shadow root and filters result', () => { cy .get('#shadow-element-8') .find('.shadow-div', { includeShadowDom: true }) .then(($untilEl) => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil($untilEl, '.filter-me') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.class('shadow-8-nested-1') }) }) }) it('retrieves parents until jquery element within and outside of shadow root and filters result', () => { cy .get('#parent-of-shadow-container-0') .then(($untilEl) => { cy .get('#shadow-element-8') .find('.shadow-8-nested-3', { includeShadowDom: true }) .parentsUntil($untilEl, '.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.class('shadow-8-nested-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) }) it('retrieves parents until jquery element normally when no shadow roots exist and filters result', () => { cy .get('body') .then(($untilEl) => { cy .get('#shadow-element-3') .parentsUntil($untilEl, '.filter-me') .then(($parents) => { expect($parents.length).to.eq(1) expect($parents[0]).to.have.id('parent-of-shadow-container-1') }) }) }) it('handles multiple elements in subject', () => { cy .get('html') .then(($untilEl) => { cy .get('#shadow-element-3, #shadow-element-8') .find('p', { includeShadowDom: true }) .parentsUntil($untilEl, '.filter-me') .then(($parents) => { expect($parents.length).to.eq(3) expect($parents[0]).to.have.id('parent-of-shadow-container-1') expect($parents[1]).to.have.id('parent-of-shadow-container-3') expect($parents[2]).to.match('body') }) }) }) }) }) })