These commands help you find related elements on a web page. cy.siblings() finds elements next to the current one. cy.closest() finds the nearest parent element that matches a condition.
cy.siblings() and cy.closest() in Cypress
cy.get(selector).siblings([filter]) cy.get(selector).closest(selector)
cy.siblings() finds all sibling elements of the current element. You can add a filter to narrow down results.
cy.closest() travels up the DOM tree to find the nearest ancestor matching the selector.
cy.get('.item').siblings() // Finds all siblings of elements with class 'item'
cy.get('.item').siblings('.active') // Finds siblings with class 'active' only
cy.get('.button').closest('form') // Finds the nearest form that contains the button
cy.get('#input').closest('.container') // Finds the nearest ancestor with class 'container'
This test visits a sample page. The first test finds siblings of the active list item and checks there are 3 siblings. The second test finds the closest form of an input and checks it has the expected class.
describe('Test siblings and closest commands', () => { beforeEach(() => { cy.visit('https://example.cypress.io/commands/traversal') }) it('checks siblings of a list item', () => { cy.get('.traversal-list > li.active') .siblings() .should('have.length', 3) }) it('finds closest form of an input', () => { cy.get('#inputEmail') .closest('form') .should('have.class', 'form-horizontal') }) })
Use cy.siblings() to find elements on the same level in the DOM tree.
Use cy.closest() to find the nearest parent element matching a selector.
Both commands help navigate the page structure to write better tests.
cy.siblings() finds elements next to the current one.
cy.closest() finds the nearest parent matching a selector.
These commands help you check related elements easily in tests.
Practice
cy.siblings() do in a test?Solution
Step 1: Understand the purpose of
This command selects all elements that share the same parent as the current element, meaning they are at the same level in the DOM tree.cy.siblings()Step 2: Compare with other options
cy.closest()finds a parent, not siblings. Child elements are found withcy.children(). Finding all elements on the page is not related.Final Answer:
Finds all elements at the same level as the current element -> Option DQuick Check:
cy.siblings()= same-level elements [OK]
- Confusing siblings with parents
- Thinking siblings are child elements
- Assuming it finds all elements on the page
.container using Cypress?Solution
Step 1: Identify the element to start from
You must start from a known element, for examplecy.get('.child'), then find its closest parent matching.container.Step 2: Use
The correct syntax isclosest()with selectorcy.get('.child').closest('.container'). cy.get('.container').closest() is wrong becauseclosest()needs to be called on an element, not on the selector itself. cy.closest('.container') is invalid syntax. cy.siblings('.container') usessiblings(), which finds siblings, not parents.Final Answer:
cy.get('.child').closest('.container') -> Option CQuick Check:
Start element + closest('.container') = cy.get('.child').closest('.container') [OK]
- Calling closest() without a starting element
- Using siblings() instead of closest()
- Passing no selector to closest()
<div class='container'>
<ul>
<li class='item selected'>Item 1</li>
<li class='item'>Item 2</li>
<li class='item'>Item 3</li>
</ul>
</div>What will
cy.get('.selected').siblings('.item').should('have.length', ?) assert?Solution
Step 1: Identify siblings of the selected element
The element with class.selectedis the first<li>. Its siblings with class.itemare the other two<li>elements.Step 2: Count matching siblings
There are exactly 2 siblings with class.itembesides the selected one.Final Answer:
2 -> Option AQuick Check:
Siblings with class '.item' count = 2 [OK]
- Counting the selected element itself
- Confusing siblings with children
- Miscounting the number of siblings
cy.get('.button').closest('.container').siblings('.container').click()But the test fails with an error that no elements are found. What is the likely problem?
Solution
Step 1: Understand the chaining of commands
cy.get('.button')finds the button,closest('.container')finds its nearest parent container, thensiblings('.container')looks for containers at the same level as that parent.Step 2: Reason about the DOM structure
If no sibling containers exist next to the closest parent,siblings('.container')returns empty, causingclick()to fail.Final Answer:
There are no sibling elements with class '.container' next to the closest parent -> Option BQuick Check:
No siblings found = test fails [OK]
- Thinking closest() can't chain after get()
- Believing siblings() works on parents
- Assuming click() is invalid after siblings()
Solution
Step 1: Identify the target buttons
You want siblings of the clicked button that share the same parent container, sosiblings('.button')after selecting the clicked button is correct.Step 2: Analyze other options
cy.get('.button.clicked').closest('.container').siblings('.button') finds sibling containers, not buttons. cy.get('.button.clicked').closest('.container').find('.button').siblings() finds buttons inside the container but then calls siblings() without a selector, which may include unrelated elements. cy.get('.button.clicked').siblings().closest('.container') finds siblings first, then closest container, which does not select sibling buttons correctly.Final Answer:
cy.get('.button.clicked').siblings('.button') -> Option AQuick Check:
Siblings with class '.button' = cy.get('.button.clicked').siblings('.button') [OK]
- Using closest() before siblings() incorrectly
- Selecting sibling containers instead of buttons
- Calling siblings() without a selector
Ready to prove it?
Pass the test and this pattern moves unknown
