Direct answer
Use data-* attributes for stable selectors
When a form control can change or disappear, start by asking whether the test is tied to the control’s implementation or to its testing purpose. Cypress recommends using `data-*` attributes to give selectors context and isolate them from CSS or JavaScript changes.
For a person editor, a selector such as `[data-cy="birth-month"]` expresses what the test needs to find. A selector based on a class, ID, or tag expresses how the control happens to be built today. Cypress identifies selectors that depend on CSS attributes, dynamic classes, IDs, or changing text as brittle choices.
This approach applies to teams maintaining end-to-end tests while forms are being redesigned. It also gives the application and test suite a shared contract: if the control is required for the flow, it should have a stable testing attribute.
Selecting controls with cy.get()
Cypress’s `cy.get()` command selects elements by CSS selector. Use it when the control is present and has a stable selector:
```js cy.get('[data-cy="birth-month"]').select('January') ```
The important part is not the exact command chain. It is that the selector identifies the control by an intentional test-facing attribute, rather than by a styling hook or a position in the page. Cypress’s selector guidance recommends `data-*` attributes for this purpose.
If the editor no longer renders a birth-month control, changing the selector will not restore the missing element. The test should first reflect the current product behavior: either the control remains part of the expected flow and must be rendered, or the test’s expected flow must change.
Using DOM traversal when direct selectors are unavailable
When a direct selector is unavailable, Cypress supports DOM traversal commands such as `find()`, `parent()`, `parents()`, `children()`, `next()`, `prev()`, and `within()`. These commands can narrow a search to a specific form or section instead of relying on a broad page-level match.
Use traversal to clarify the control’s location, not to hide an unstable structure. Cypress notes that selectors should remain clear and resilient to application changes.
Applying these techniques to a missing form control
For `cy.createPersonWithBirthday`, check the person editor’s rendered controls before repairing the selector. If the month control exists, give it a stable `data-*` attribute and target it with `cy.get()`. If it does not exist, treat that as a product-and-test contract question, not merely a selector failure.
Cypress can run tests directly in a real browser, making it possible to inspect what the test actually reaches. Use that visibility to confirm whether the control is present, whether the test is searching in the right form, and whether the expected birthday flow still matches the editor.
What to do next
Review the cited sources and apply the relevant guidance described above.
Sources
- Testing Frameworks for Javascript | Write, Run, Debug | Cypress
- Cypress best practices | Cypress Documentation
- Understanding Selectors in Frontend Development and Cypress Testing
Comments
No comments yet.