/**
 * @module cypress
 */
/// <reference types="cypress" />
type CyOptions = Partial<Cypress.Loggable & Cypress.Timeoutable & Cypress.Withinable & Cypress.Shadow>;
type DataCyWithSubject = (subject: Cypress.JQueryWithSelector<HTMLElement> | HTMLElement | undefined, selector: string, children?: string | null, options?: CyOptions) => Cypress.Chainable<Cypress.JQueryWithSelector<HTMLElement>>;
type DataCy = DataCyWithSubject & {
    (selector: string, children?: string | null, options?: CyOptions, never?: never): Cypress.Chainable<Cypress.JQueryWithSelector<HTMLElement>>;
    commandOptions?: {
        prevSubject: "optional";
    };
};
/**
 * Select an html element by its data-cy attribute.
 *
 * ```ts
 * cy.dataCy('something').click() // -> cy.get("[data-cy='something']").click()
 * ```
 *
 * Accepts children which will then become further selectors
 *
 * ```ts
 * cy.dataCy('something', '.nested').click()
 * // -> cy.get("[data-cy='something'] .nested").click()
 * ```
 *
 * And is chainable such that it will use the previous element as its scope
 *
 * ```ts
 * cy.dataCy('something').dataCy("other").click()
 * // -> cy.get("[data-cy='something']").within(() => cy.get("[data-cy='other']").click())
 * cy.get('.top').dataCy('something') // same idea as above
 * ```
 *
 * Finally, it supports taking the first signature literally and passing in
 * a subject directly. That's very likely an unnecessary step and convention/obvious errors
 * would prevent it, but going for complete here
 *
 * ```ts
 * cy.get(".first-selector").then(($first) =>
 *   cy.dataCy($first, "second-selector").should("contain", 0)
 * );
 * ```
 *
 * Note: this is not added to cypress commands by default. Pass to {@link addCommands}
 * or a custom function this should be added as a cypress command.
 */
export declare const dataCy: DataCy;
export {};
