I'm learning best practice for Cypress selector strategies. Given that I want to get the release number from the Cypress Releases page, with the following HTML snippet:
<div >
<article >
<h1 >Changelog</h1>
<div >
<h2 id="9-5-4">
<a href="#9-5-4" aria-hidden="true" tabindex="-1"><span >
</span>
</a>9.5.4
</h2>
...what would be the optimal, future proofed selector to use to get the 9.5.4 version number text from frome the <h2>?
My thinking is that the Changelog text for the <h1> is unlikely to change, but the <h2> that contains the text is not a child nor a sibling.
So something like this?
cy.get("div.nuxt-content")
.first("h2").then((txt=>{
const versionTxt = txt.find("a").text()
expect(versionTxt).to.equal('9.5.4')
However, this fails to find the targeted text
CodePudding user response:
Your test fails because the text '9.5.4' is outside the </a> closing tag and .text() only gives you innerText.
Based on the HTML,
cy.get("div.nuxt-content")
.first("h2").then((txt=>{
const versionTxt = txt.text()
expect(versionTxt).to.equal('9.5.4')
or
cy.get('h2[id="9-5-4"]')
.invoke('text')
.should('eq', '9.5.4')
CodePudding user response:
You can use the include.text to check the version number.
cy.get('h2#9-5-4').should('include.text', '9.5.4')
CodePudding user response:
Depending on your use case, using cy.contains could be a viable option. It wouldn't use selectors, but may be a better solution in some cases (such as overly complex HTML that only has one element with a specific text).
// Just getting the element
cy.contains('9.5.4');
// Validating element exists -- implied by above, but explicit below
cy.contains('9.5.4').should('exist');
