/// context("Querying", () => { beforeEach(() => { cy.visit("https://example.cypress.io/commands/querying") }) // The most commonly used query is 'cy.get()', you can // think of this like the '$' in jQuery it("cy.get() - query DOM elements", () => { // https://on.cypress.io/get cy.get("#query-btn").should("contain", "Button") cy.get(".query-btn").should("contain", "Button") cy.get("#querying .well>button:first").should("contain", "Button") // ↲ // Use CSS selectors just like jQuery cy.get('[data-test-id="test-example"]').should("have.class", "example") // 'cy.get()' yields jQuery object, you can get its attribute // by invoking `.attr()` method cy.get('[data-test-id="test-example"]') .invoke("attr", "data-test-id") .should("equal", "test-example") // or you can get element's CSS property cy.get('[data-test-id="test-example"]') .invoke("css", "position") .should("equal", "static") // or use assertions directly during 'cy.get()' // https://on.cypress.io/assertions cy.get('[data-test-id="test-example"]') .should("have.attr", "data-test-id", "test-example") .and("have.css", "position", "static") }) it("cy.contains() - query DOM elements with matching content", () => { // https://on.cypress.io/contains cy.get(".query-list").contains("bananas").should("have.class", "third") // we can pass a regexp to `.contains()` cy.get(".query-list").contains(/^b\w+/).should("have.class", "third") cy.get(".query-list").contains("apples").should("have.class", "first") // passing a selector to contains will // yield the selector containing the text cy.get("#querying") .contains("ul", "oranges") .should("have.class", "query-list") cy.get(".query-button") .contains("Save Form") .should("have.class", "btn") }) it(".within() - query DOM elements within a specific element", () => { // https://on.cypress.io/within cy.get(".query-form").within(() => { cy.get("input:first").should("have.attr", "placeholder", "Email") cy.get("input:last").should("have.attr", "placeholder", "Password") }) }) it("cy.root() - query the root DOM element", () => { // https://on.cypress.io/root // By default, root is the document cy.root().should("match", "html") cy.get(".query-ul").within(() => { // In this within, the root is now the ul DOM element cy.root().should("have.class", "query-ul") }) }) it("best practices - selecting elements", () => { // https://on.cypress.io/best-practices#Selecting-Elements cy.get("[data-cy=best-practices-selecting-elements]").within(() => { // Worst - too generic, no context cy.get("button").click() // Bad. Coupled to styling. Highly subject to change. cy.get(".btn.btn-large").click() // Average. Coupled to the `name` attribute which has HTML semantics. cy.get("[name=submission]").click() // Better. But still coupled to styling or JS event listeners. cy.get("#main").click() // Slightly better. Uses an ID but also ensures the element // has an ARIA role attribute cy.get("#main[role=button]").click() // Much better. But still coupled to text content that may change. cy.contains("Submit").click() // Best. Insulated from all changes. cy.get("[data-cy=submit]").click() }) }) })