cypress
Version:
Cypress is a next generation front end testing tool built for the modern web
1,428 lines (1,310 loc) • 262 kB
TypeScript
/* eslint-disable @typescript-eslint/no-unused-vars */
/// <reference path="./cypress-npm-api.d.ts" />
/// <reference path="./cypress-eventemitter.d.ts" />
/// <reference path="./cypress-type-helpers.d.ts" />
declare namespace Cypress {
type FileContents = string | any[] | object
type HistoryDirection = 'back' | 'forward'
type HttpMethod = string
type RequestBody = string | object | boolean | null
type ViewportOrientation = 'portrait' | 'landscape'
type PrevSubject = keyof PrevSubjectMap
type TestingType = 'e2e' | 'component'
type PluginConfig = (on: PluginEvents, config: PluginConfigOptions) => void | ConfigOptions | Promise<ConfigOptions>
interface JQueryWithSelector<TElement = HTMLElement> extends JQuery<TElement> {
selector?: string | null
}
interface PrevSubjectMap<O = unknown> {
optional: O
element: JQueryWithSelector
document: Document
window: Window
}
interface CommandOptions {
prevSubject: boolean | PrevSubject | PrevSubject[]
}
interface CommandFn<T extends keyof ChainableMethods> {
(this: Mocha.Context, ...args: Parameters<ChainableMethods[T]>): ReturnType<ChainableMethods[T]> | void
}
interface CommandFns {
[name: string]: (this: Mocha.Context, ...args: any) => any
}
interface CommandFnWithSubject<T extends keyof ChainableMethods, S> {
(this: Mocha.Context, prevSubject: S, ...args: Parameters<ChainableMethods[T]>): ReturnType<ChainableMethods[T]> | void
}
interface CommandFnsWithSubject<S> {
[name: string]: (this: Mocha.Context, prevSubject: S, ...args: any) => any
}
interface CommandOriginalFn<T extends keyof ChainableMethods> extends CallableFunction {
(...args: Parameters<ChainableMethods[T]>): ReturnType<ChainableMethods[T]>
}
interface CommandOriginalFnWithSubject<T extends keyof ChainableMethods, S> extends CallableFunction {
(prevSubject: S, ...args: Parameters<ChainableMethods[T]>): ReturnType<ChainableMethods[T]>
}
interface CommandFnWithOriginalFn<T extends keyof Chainable> {
(this: Mocha.Context, originalFn: CommandOriginalFn<T>, ...args: Parameters<ChainableMethods[T]>): ReturnType<ChainableMethods[T]> | void
}
interface CommandFnWithOriginalFnAndSubject<T extends keyof Chainable, S> {
(this: Mocha.Context, originalFn: CommandOriginalFnWithSubject<T, S>, prevSubject: S, ...args: Parameters<ChainableMethods[T]>): ReturnType<ChainableMethods[T]> | void
}
interface QueryFn<T extends keyof ChainableMethods> {
(this: Command, ...args: Parameters<ChainableMethods[T]>): (subject: any) => any
}
interface QueryFnWithOriginalFn<T extends keyof Chainable> {
(this: Command, originalFn: QueryFn<T>, ...args: Parameters<ChainableMethods[T]>): (subject: any) => any
}
interface ObjectLike {
[key: string]: any
}
interface Auth {
username: string
password: string
}
interface RemoteState {
auth?: Auth
domainName: string
strategy: 'file' | 'http'
origin: string
fileServer: string | null
props: Record<string, any> | null
}
interface Backend {
(task: 'net', eventName: string, frame: any): Promise<void>
}
type BrowserName = 'electron' | 'chrome' | 'chromium' | 'firefox' | 'edge' | string
type BrowserChannel = 'stable' | 'canary' | 'beta' | 'dev' | 'nightly' | string
type BrowserFamily = 'chromium' | 'firefox' | 'webkit'
/**
* Describes a browser Cypress can control
*/
interface Browser {
/**
* Short browser name.
*/
name: BrowserName
/**
* The underlying engine for this browser.
*/
family: BrowserFamily
/**
* The release channel of the browser.
*/
channel: BrowserChannel
/**
* Human-readable browser name.
*/
displayName: string
version: string
majorVersion: number | string
path: string
isHeaded: boolean
isHeadless: boolean
/**
* Informational text to accompany this browser. Shown in desktop-gui.
*/
info?: string
/**
* Warning text to accompany this browser. Shown in desktop-gui.
*/
warning?: string
/**
* If `true`, this browser version is not supported in Cypress.
*/
unsupportedVersion?: boolean
}
/**
* Browser that's exposed in public APIs
*/
interface PublicBrowser {
channel: BrowserChannel
displayName: string
family: string
majorVersion?: string | number | null
name: BrowserName
path: string
version: string
}
interface Ensure {
/**
* Throws an error if `subject` is not one of the passed in `type`s.
*/
isType(subject: any, type: PrevSubject[], commandName: string, cy: Chainable): void
/**
* Throws an error if `subject` is not a DOM element.
*/
isElement(subject: any, commandName: string, cy: Chainable): void
/**
* Throws an error if `subject` is not a `document`.
*/
isDocument(subject: any, commandName: string, cy: Chainable): void
/**
* Throws an error if `subject` is not a `window`.
*/
isWindow(subject: any, commandName: string, cy: Chainable): void
/**
* Throws an error if `subject` is not a DOM element attached to the application under test.
*/
isAttached(subject: any, commandName: string, cy: Chainable, onFail?: Log): void
/**
* Throws an error if `subject` is a disabled DOM element.
*/
isNotDisabled(subject: any, commandName: string, onFail?: Log): void
/**
* Throws an error if `subject` is a DOM element hidden by any of its parent elements.
*/
isNotHiddenByAncestors(subject: any, commandName: string, onFail?: Log): void
/**
* Throws an error if `subject` is a read-only form element.
*/
isNotReadonly(subject: any, commandName: string, onFail?: Log): void
/**
* Throws an error if `subject` is a read-only form element.
*/
isScrollable(subject: any, commandName: string, onFail?: Log): void
/**
* Throws an error if `subject` is not a DOM element visible in the AUT.
*/
isVisible(subject: any, commandName: string, onFail?: Log): void
}
interface LocalStorage {
/**
* Called internally to clear `localStorage` in two situations.
*
* 1. Before every test, this is called with no argument to clear all keys.
* 2. On `cy.clearLocalStorage(keys)` this is called with `keys` as an argument.
*
* You should not call this method directly to clear `localStorage`; instead, use `cy.clearLocalStorage(key)`.
*
* @see https://on.cypress.io/clearlocalstorage
*/
clear: (keys?: string[]) => void
}
// TODO: raise minimum required TypeScript version to 3.7
// and make this recursive
// https://github.com/cypress-io/cypress/issues/24875
type Storable =
| string
| number
| boolean
| null
| StorableObject
| StorableArray
interface StorableObject {
[key: string]: Storable
}
interface StorableArray extends Array<Storable> { }
type StorableRecord = Record<string, Storable>
interface OriginStorage {
origin: string
value: StorableRecord
}
interface Storages {
localStorage: OriginStorage[]
sessionStorage: OriginStorage[]
}
interface StorageByOrigin {
[key: string]: StorableRecord
}
type IsBrowserMatcher = BrowserName | Partial<Browser> | Array<BrowserName | Partial<Browser>>
interface ViewportPosition extends WindowPosition {
right: number
bottom: number
}
interface WindowPosition {
top: number
left: number
topCenter: number
leftCenter: number
}
interface ElementPositioning {
scrollTop: number
scrollLeft: number
width: number
height: number
fromElViewport: ViewportPosition
fromElWindow: WindowPosition
fromAutWindow: WindowPosition
}
interface ElementCoordinates {
width: number
height: number
fromElViewport: ViewportPosition & { x: number, y: number }
fromElWindow: WindowPosition & { x: number, y: number }
fromAutWindow: WindowPosition & { x: number, y: number }
}
/**
* Spec type for the given test. "integration" is the default, but
* tests run using `open --component` will be "component"
*
* @see https://on.cypress.io/experiments
*/
type CypressSpecType = 'integration' | 'component'
/**
* A Cypress spec.
*/
interface Spec {
name: string // "config_passing_spec.js"
relative: string // "cypress/e2e/config_passing_spec.cy.js" or "__all" if clicked all specs button
absolute: string // "/Users/janelane/app/cypress/e2e/config_passing_spec.cy.js"
specFilter?: string // optional spec filter used by the user
specType?: CypressSpecType
baseName?: string // "config_passing_spec.cy.js"
fileExtension?: string // ".js"
fileName?: string // "config_passing_spec.cy"
id?: string // "U3BlYzovVXNlcnMvamFuZWxhbmUvYXBwL2N5cHJlc3MvZTJlL2NvbmZpZ19wYXNzaW5nX3NwZWMuY3kuanM="
}
/**
* Window type for Application Under Test(AUT)
*/
type AUTWindow = Window & typeof globalThis & ApplicationWindow
/**
* The interface for user-defined properties in Window object under test.
*/
interface ApplicationWindow { } // tslint:disable-line
/**
* The configuration for Cypress.
*/
type Config = ResolvedConfigOptions & RuntimeConfigOptions & RuntimeServerConfigOptions
/**
* Several libraries are bundled with Cypress by default.
*
* @see https://on.cypress.io/api
*/
interface Cypress {
/**
* Lodash library
*
* @see https://on.cypress.io/_
* @example
* Cypress._.keys(obj)
*/
_: _.LoDashStatic
/**
* jQuery library
*
* @see https://on.cypress.io/$
* @example
* Cypress.$('p')
*/
$: JQueryStatic
/**
* Cypress automatically includes a Blob library and exposes it as Cypress.Blob.
*
* @see https://on.cypress.io/blob
* @see https://github.com/nolanlawson/blob-util
* @example
* Cypress.Blob.method()
*/
Blob: BlobUtil.BlobUtilStatic
/**
* Cypress automatically includes a Buffer library and exposes it as Cypress.Buffer.
*
* @see https://on.cypress.io/buffer
* @see https://github.com/feross/buffer
* @example
* Cypress.Buffer.method()
*/
Buffer: BufferType
/**
* Cypress automatically includes minimatch and exposes it as Cypress.minimatch.
*
* @see https://on.cypress.io/minimatch
*/
minimatch: typeof Minimatch.minimatch
/**
* Cypress automatically includes Bluebird and exposes it as Cypress.Promise.
*
* @see https://on.cypress.io/promise
* @see https://github.com/petkaantonov/bluebird
* @example
* new Cypress.Promise((resolve, reject) => { ... })
*/
Promise: Bluebird.BluebirdStatic
/**
* Cypress includes Sinon.js library used in `cy.spy` and `cy.stub`.
*
* @see https://sinonjs.org/
* @see https://on.cypress.io/stubs-spies-and-clocks
* @see https://example.cypress.io/commands/spies-stubs-clocks
*/
sinon: sinon.SinonStatic
/**
* Utility functions for ensuring various properties about a subject.
* @see https://on.cypress.io/api/custom-queries
*/
ensure: Ensure
/**
* Cypress version string. i.e. "1.1.2"
* @see https://on.cypress.io/version
* @example
```
expect(Cypress.version).to.be.a('string')
if (Cypress.version === '1.2.0') {
// test something specific
}
```
*/
version: string
/**
* OS platform name, from Node `os.platform()`
*
* @see https://nodejs.org/api/os.html#os_os_platform
* @example
* Cypress.platform // "darwin"
*/
platform: string
/**
* CPU architecture, from Node `os.arch()`
*
* @see https://nodejs.org/api/os.html#os_os_arch
* @example
* Cypress.arch // "x64"
*/
arch: string
/**
* Currently executing spec file.
* @example
* ```
* Cypress.spec
* // {
* // name: "config_passing_spec.coffee",
* // relative: "cypress/integration/config_passing_spec.coffee",
* // absolute: "/users/smith/projects/web/cypress/integration/config_passing_spec.coffee"
* // specType: "integration"
* // }
* ```
*/
spec: Spec
/**
* Currently executing test runnable instance.
*/
currentTest: {
title: string
titlePath: string[]
}
/**
* Information about current test retry
*/
currentRetry: number
/**
* Information about the browser currently running the tests
*/
browser: Browser
/**
* Internal class for LocalStorage management.
*/
LocalStorage: LocalStorage
/**
* Internal class for session management.
*/
session: Session
/**
* Current testing type, determined by the Test Runner chosen to run.
*/
testingType: TestingType
/**
* Fire automation:request event for internal use.
*/
automation(eventName: string, ...args: any[]): Bluebird.Promise<any>
/**
* Promise wrapper for certain internal tasks.
*/
backend: Backend
/**
* Returns all configuration objects.
* @see https://on.cypress.io/config
* @example
```
Cypress.config()
// {defaultCommandTimeout: 10000, pageLoadTimeout: 30000, ...}
```
*/
config(): Config
/**
* Returns one configuration value.
* @see https://on.cypress.io/config
* @example
```
Cypress.config('pageLoadTimeout')
// 60000
```
*/
config<K extends keyof Config>(key: K): Config[K]
/**
* Sets one configuration value.
* @see https://on.cypress.io/config
* @example
```
Cypress.config('viewportWidth', 800)
```
*/
config<K extends keyof TestConfigOverrides>(key: K, value: TestConfigOverrides[K]): void
/**
* Sets multiple configuration values at once.
* @see https://on.cypress.io/config
* @example
```
Cypress.config({
defaultCommandTimeout: 10000,
viewportHeight: 900
})
```
*/
config(Object: TestConfigOverrides): void
// no real way to type without generics
/**
* Returns all environment variables set with CYPRESS_ prefix or in "env" object in "cypress.config.{js,ts,mjs,cjs}"
*
* @see https://on.cypress.io/env
*/
env(): ObjectLike
/**
* Returns specific environment variable or undefined
* @see https://on.cypress.io/env
* @example
* // cypress.config.js
* { "env": { "foo": "bar" } }
* Cypress.env("foo") // => bar
*/
env(key: string): any
/**
* Set value for a variable.
* Any value you change will be permanently changed for the remainder of your tests.
* @see https://on.cypress.io/env
* @example
* Cypress.env("host", "http://server.dev.local")
*/
env(key: string, value: any): void
/**
* Set values for multiple variables at once. Values are merged with existing values.
* @see https://on.cypress.io/env
* @example
* Cypress.env({ host: "http://server.dev.local", foo: "foo" })
*/
env(object: ObjectLike): void
/**
* @returns the number of test retries currently enabled for the run
*/
getTestRetries(): number | null
/**
* Checks if a variable is a valid instance of `cy` or a `cy` chainable.
*
* @see https://on.cypress.io/iscy
* @example
* Cypress.isCy(cy) // => true
*/
isCy<TSubject = any>(obj: Chainable<TSubject>): obj is Chainable<TSubject>
isCy(obj: any): obj is Chainable
/**
* Returns true if currently running the supplied browser name or matcher object. Also accepts an array of matchers.
* @example isBrowser('chrome') will be true for the browser 'chrome:canary' and 'chrome:stable'
* @example isBrowser({ name: 'firefox', channel: 'dev' }) will be true only for the browser 'firefox:dev' (Firefox Developer Edition)
* @example isBrowser(['firefox', 'edge']) will be true only for the browsers 'firefox' and 'edge'
* @example isBrowser('!firefox') will be true for every browser other than 'firefox'
* @example isBrowser({ family: '!chromium'}) will be true for every browser not matching { family: 'chromium' }
* @param matcher browser name or matcher object to check.
*/
isBrowser(name: IsBrowserMatcher): boolean
/**
* Internal options for "cy.log" used in custom commands.
*
* @see https://on.cypress.io/cypress-log
*/
log(options: Partial<LogConfig>): Log
/**
* Stop the Cypress App on the current machine while tests are running
* @see https://on.cypress.io/cypress-stop
* @example
* Cypress.stop()
*/
stop(): void
Commands: {
/**
* Add a custom command
* @see https://on.cypress.io/api/commands
*/
add<T extends keyof Chainable>(name: T, fn: CommandFn<T>): void
/**
* Add a custom parent command
* @see https://on.cypress.io/api/commands#Parent-Commands
*/
add<T extends keyof Chainable>(name: T, options: CommandOptions & { prevSubject: false }, fn: CommandFn<T>): void
/**
* Add a custom child command
* @see https://on.cypress.io/api/commands#Child-Commands
*/
add<T extends keyof Chainable, S = any>(name: T, options: CommandOptions & { prevSubject: true }, fn: CommandFnWithSubject<T, S>): void
/**
* Add a custom child or dual command
* @see https://on.cypress.io/api/commands#Validations
*/
add<T extends keyof Chainable, S extends PrevSubject>(
name: T, options: CommandOptions & { prevSubject: S | ['optional'] }, fn: CommandFnWithSubject<T, PrevSubjectMap[S]>,
): void
/**
* Add a custom command that allows multiple types as the prevSubject
* @see https://on.cypress.io/api/commands#Validations#Allow-Multiple-Types
*/
add<T extends keyof Chainable, S extends PrevSubject>(
name: T, options: CommandOptions & { prevSubject: S[] }, fn: CommandFnWithSubject<T, PrevSubjectMap<void>[S]>,
): void
/**
* Add one or more custom commands
* @see https://on.cypress.io/api/commands
*/
addAll<T extends keyof Chainable>(fns: CommandFns): void
/**
* Add one or more custom parent commands
* @see https://on.cypress.io/api/commands#Parent-Commands
*/
addAll<T extends keyof Chainable>(options: CommandOptions & { prevSubject: false }, fns: CommandFns): void
/**
* Add one or more custom child commands
* @see https://on.cypress.io/api/commands#Child-Commands
*/
addAll<T extends keyof Chainable, S = any>(options: CommandOptions & { prevSubject: true }, fns: CommandFnsWithSubject<S>): void
/**
* Add one or more custom commands that validate their prevSubject
* @see https://on.cypress.io/api/commands#Validations
*/
addAll<T extends keyof Chainable, S extends PrevSubject>(
options: CommandOptions & { prevSubject: S | ['optional'] }, fns: CommandFnsWithSubject<PrevSubjectMap[S]>,
): void
/**
* Add one or more custom commands that allow multiple types as their prevSubject
* @see https://on.cypress.io/api/commands#Allow-Multiple-Types
*/
addAll<T extends keyof Chainable, S extends PrevSubject>(
options: CommandOptions & { prevSubject: S[] }, fns: CommandFnsWithSubject<PrevSubjectMap<void>[S]>,
): void
/**
* Overwrite an existing Cypress command with a new implementation
* @see https://on.cypress.io/api/commands#Overwrite-Existing-Commands
*/
overwrite<T extends keyof Chainable>(name: T, fn: CommandFnWithOriginalFn<T>): void
/**
* Overwrite an existing Cypress command with a new implementation
* @see https://on.cypress.io/api/commands#Overwrite-Existing-Commands
*/
overwrite<T extends keyof Chainable, S extends PrevSubject>(name: T, fn: CommandFnWithOriginalFnAndSubject<T, PrevSubjectMap[S]>): void
/**
* Add a custom query
* @see https://on.cypress.io/api/custom-queries
*/
addQuery<T extends keyof Chainable>(name: T, fn: QueryFn<T>): void
/**
* Overwrite an existing Cypress query with a new implementation
* @see https://on.cypress.io/api/custom-queries
*/
overwriteQuery<T extends keyof Chainable>(name: T, fn: QueryFnWithOriginalFn<T>): void
}
/**
* @see https://on.cypress.io/cookies
*/
Cookies: {
debug(enabled: boolean, options?: Partial<DebugOptions>): void
}
/**
* @see https://on.cypress.io/dom
*/
dom: {
/**
* Returns a jQuery object obtained by wrapping an object in jQuery.
*/
wrap(wrappingElement_function: JQuery.Selector | JQuery.htmlString | Element | JQuery | ((index: number) => string | JQuery)): JQuery
query(selector: JQuery.Selector, context?: Element | JQuery): JQuery
/**
* Returns an array of raw elements pulled out from a jQuery object.
*/
unwrap(obj: any): any
/**
* Returns a boolean indicating whether an object is a DOM object.
*/
isDom(obj: any): boolean
isType(element: JQuery | HTMLElement, type: string): boolean
/**
* Returns a boolean indicating whether an element is visible.
*/
isVisible(element: JQuery | HTMLElement): boolean
/**
* Returns a boolean indicating whether an element is hidden.
*/
isHidden(element: JQuery | HTMLElement, methodName?: string, options?: object): boolean
/**
* Returns a boolean indicating whether an element can receive focus.
*/
isFocusable(element: JQuery | HTMLElement): boolean
isTextLike(element: JQuery | HTMLElement): boolean
/**
* Returns a boolean indicating whether an element is scrollable.
*/
isScrollable(element: Window | JQuery | HTMLElement): boolean
/**
* Returns a boolean indicating whether an element currently has focus.
*/
isFocused(element: JQuery | HTMLElement): boolean
/**
* Returns a boolean indicating whether an element is detached from the DOM.
*/
isDetached(element: JQuery | HTMLElement): boolean
/**
* Returns a boolean indicating whether an element is attached to the DOM.
*/
isAttached(element: JQuery | HTMLElement | Window | Document): boolean
isSelector(element: JQuery | HTMLElement, selector: JQuery.Selector): boolean
/**
* Returns a boolean indicating whether an element is a descendent of another element.
*/
isDescendent(element1: JQuery | HTMLElement, element2: JQuery | HTMLElement): boolean
/**
* Returns a boolean indicating whether object is undefined or html, body, or document.
*/
isUndefinedOrHTMLBodyDoc(obj: any): boolean
/**
* Returns a boolean indicating whether an object is a DOM element.
*/
isElement(obj: any): boolean
/**
* Returns a boolean indicating whether a node is of document type.
*/
isDocument(obj: any): boolean
/**
* Returns a boolean indicating whether an object is a window object.
*/
isWindow(obj: any): obj is Window
/**
* Returns a boolean indicating whether an object is a jQuery object.
*/
isJquery(obj: any): obj is JQuery
isInputType(element: JQuery | HTMLElement, type: string | string[]): boolean
stringify(element: JQuery | HTMLElement, form: string): string
getElements(element: JQuery): JQuery | HTMLElement[]
getContainsSelector(text: string, filter?: string, options?: CaseMatchable): JQuery.Selector
getFirstDeepestElement(elements: HTMLElement[], index?: number): HTMLElement
getWindowByElement(element: JQuery | HTMLElement): JQuery | HTMLElement
getReasonIsHidden(element: JQuery | HTMLElement, options?: object): string
getFirstScrollableParent(element: JQuery | HTMLElement): JQuery | HTMLElement
getFirstFixedOrStickyPositionParent(element: JQuery | HTMLElement): JQuery | HTMLElement
getFirstStickyPositionParent(element: JQuery | HTMLElement): JQuery | HTMLElement
getCoordsByPosition(left: number, top: number, xPosition?: string, yPosition?: string): number
getElementPositioning(element: JQuery | HTMLElement): ElementPositioning
getElementAtPointFromViewport(doc: Document, x: number, y: number): Element | null
getElementCoordinatesByPosition(element: JQuery | HTMLElement, position?: string): ElementCoordinates
getElementCoordinatesByPositionRelativeToXY(element: JQuery | HTMLElement, x: number, y: number): ElementPositioning
getHostContenteditable(element: HTMLElement): HTMLElement
getSelectionBounds(element: HTMLElement): { start: number, end: number }
}
/**
* @see https://on.cypress.io/keyboard-api
*/
Keyboard: {
defaults(options: Partial<KeyboardDefaultsOptions>): void
}
/**
* @see https://on.cypress.io/screenshot-api
*/
Screenshot: {
defaults(options: Partial<ScreenshotDefaultsOptions>): void
}
/**
* @see https://on.cypress.io/selector-playground-api
*/
SelectorPlayground: {
defaults(options: Partial<SelectorPlaygroundDefaultsOptions>): void
getSelector($el: JQuery): JQuery.Selector
}
/**
* These events come from Cypress as it issues commands and reacts to their state. These are all useful to listen to for debugging purposes.
* @see https://on.cypress.io/catalog-of-events#App-Events
*/
on: Actions
/**
* These events come from Cypress as it issues commands and reacts to their state. These are all useful to listen to for debugging purposes.
* @see https://on.cypress.io/catalog-of-events#App-Events
*/
once: Actions
/**
* These events come from Cypress as it issues commands and reacts to their state. These are all useful to listen to for debugging purposes.
* @see https://on.cypress.io/catalog-of-events#App-Events
*/
off: Actions
/**
* Used to include dependencies within the cy.origin() callback
* @see https://on.cypress.io/origin
*/
require: <T = any>(id: string) => T
/**
* Trigger action
* @private
*/
action: <T = (any[] | void) >(action: string, ...args: any[]) => T
/**
* Load files
* @private
*/
onSpecWindow: (window: Window, specList: string[] | Array<() => Promise<void>>) => void
}
type CanReturnChainable = void | Chainable | Promise<unknown>
type ThenReturn<S, R> =
R extends void ? Chainable<S> :
R extends R | undefined ? Chainable<S | Exclude<R, undefined>> :
Chainable<S>
/**
* Chainable interface for non-array Subjects
*/
interface Chainable<Subject = any> {
/**
* Create an assertion. Assertions are automatically retried until they pass or time out.
*
* @alias should
* @see https://on.cypress.io/and
*/
and: Chainer<Subject>
/**
* Assign an alias for later use. Reference the alias later within a
* [cy.get()](https://on.cypress.io/get) or
* [cy.wait()](https://on.cypress.io/wait) command with a `@` prefix.
* You can alias DOM elements, routes, stubs and spies.
*
* @see https://on.cypress.io/as
* @see https://on.cypress.io/variables-and-aliases
* @see https://on.cypress.io/get
* @example
* // Get the aliased 'todos' elements
* cy.get('ul#todos').as('todos')
*
* // later retrieve the todos
* cy.get('@todos')
*/
as(alias: string, options?: Partial<AsOptions>): Chainable<Subject>
/**
* Blur a focused element. This element must currently be in focus.
* If you want to ensure an element is focused before blurring,
* try using .focus() before .blur().
*
* @see https://on.cypress.io/blur
*/
blur(options?: Partial<BlurOptions>): Chainable<Subject>
/**
* Check checkbox(es) or radio(s). This element must be an `<input>` with type `checkbox` or `radio`.
*
* @see https://on.cypress.io/check
* @example
* // Check checkbox element
* cy.get('[type="checkbox"]').check()
* // Check first radio element
* cy.get('[type="radio"]').first().check()
*/
check(options?: Partial<CheckClearOptions>): Chainable<Subject>
/**
* Check checkbox(es) or radio(s). This element must be an `<input>` with type `checkbox` or `radio`.
*
* @see https://on.cypress.io/check
* @example
* // Select the radio with the value of 'US'
* cy.get('[type="radio"]').check('US')
* // Check the checkboxes with the values 'ga' and 'ca'
* cy.get('[type="checkbox"]').check(['ga', 'ca'])
*/
check(value: string | string[], options?: Partial<CheckClearOptions>): Chainable<Subject>
/**
* Get the children of each DOM element within a set of DOM elements.
*
* @see https://on.cypress.io/children
*/
children<E extends Node = HTMLElement>(options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
children<K extends keyof HTMLElementTagNameMap>(selector: K, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<HTMLElementTagNameMap[K]>>
children<E extends Node = HTMLElement>(selector: string, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
/**
* Clear the value of an `input` or `textarea`.
* An alias for `.type({selectall}{del})`
*
* @see https://on.cypress.io/clear
*/
clear(options?: Partial<CheckClearOptions>): Chainable<Subject>
/**
* Clear a specific browser cookie for a domain.
*
* Cypress automatically clears all cookies _before_ each test to prevent
* state from being shared across tests when test isolation is enabled.
* You shouldn't need to use this command unless you're using it to clear
* a specific cookie inside a single test or test isolation is disabled.
*
* @see https://on.cypress.io/clearcookie
*/
clearCookie(name: string, options?: CookieOptions): Chainable<null>
/**
* Clear browser cookies for a domain.
*
* Cypress automatically clears all cookies _before_ each test to prevent
* state from being shared across tests when test isolation is enabled.
* You shouldn't need to use this command unless you're using it to clear
* specific cookies inside a single test or test isolation is disabled.
*
* @see https://on.cypress.io/clearcookies
*/
clearCookies(options?: CookieOptions): Chainable<null>
/**
* Clear all browser cookies.
*
* Cypress automatically clears all cookies _before_ each test to prevent
* state from being shared across tests when test isolation is enabled.
* You shouldn't need to use this command unless you're using it to clear
* all cookie inside a single test or test isolation is disabled.
*
* @see https://on.cypress.io/clearallcookies
*/
clearAllCookies(options?: Partial<Loggable & Timeoutable>): Chainable<null>
/**
* Get local storage for all origins.
*
* @see https://on.cypress.io/getalllocalstorage
*/
getAllLocalStorage(options?: Partial<Loggable>): Chainable<StorageByOrigin>
/**
* Clear local storage for all origins.
*
* Cypress automatically clears all local storage _before_ each test to
* prevent state from being shared across tests when test isolation
* is enabled. You shouldn't need to use this command unless you're using it
* to clear localStorage inside a single test or test isolation is disabled.
*
* @see https://on.cypress.io/clearalllocalstorage
*/
clearAllLocalStorage(options?: Partial<Loggable>): Chainable<null>
/**
* Get session storage for all origins.
*
* @see https://on.cypress.io/getallsessionstorage
*/
getAllSessionStorage(options?: Partial<Loggable>): Chainable<StorageByOrigin>
/**
* Clear session storage for all origins.
*
* @see https://on.cypress.io/clearallsessionstorage
*/
clearAllSessionStorage(options?: Partial<Loggable>): Chainable<null>
/**
* Clear data in local storage for the current origin.
*
* Cypress automatically clears all local storage _before_ each test to
* prevent state from being shared across tests when test isolation
* is enabled. You shouldn't need to use this command unless you're using it
* to clear localStorage inside a single test or test isolation is disabled.
*
* @see https://on.cypress.io/clearlocalstorage
* @param {string} [key] - name of a particular item to remove (optional).
* @example
```
// Removes all local storage keys
cy.clearLocalStorage()
.should(ls => {
expect(ls.getItem('prop1')).to.be.null
})
// Removes item "todos"
cy.clearLocalStorage("todos")
```
*/
clearLocalStorage(key?: string): Chainable<Storage>
/**
* Clear keys in local storage that match given regular expression.
*
* @see https://on.cypress.io/clearlocalstorage
* @param {RegExp} re - regular expression to match.
* @example
```
// Clears all local storage matching /app-/
cy.clearLocalStorage(/app-/)
```
*/
clearLocalStorage(re: RegExp): Chainable<Storage>
/**
* Clear data in local storage.
* Cypress automatically runs this command before each test to prevent state from being
* shared across tests. You shouldn't need to use this command unless you're using it
* to clear localStorage inside a single test. Yields `localStorage` object.
*
* @see https://on.cypress.io/clearlocalstorage
* @param {options} [object] - options object
* @example
```
// Removes all local storage items, without logging
cy.clearLocalStorage({ log: false })
```
*/
clearLocalStorage(options: Partial<Loggable>): Chainable<Storage>
/**
* Clear data in local storage.
* Cypress automatically runs this command before each test to prevent state from being
* shared across tests. You shouldn't need to use this command unless you're using it
* to clear localStorage inside a single test. Yields `localStorage` object.
*
* @see https://on.cypress.io/clearlocalstorage
* @param {string} [key] - name of a particular item to remove (optional).
* @param {options} [object] - options object
* @example
```
// Removes item "todos" without logging
cy.clearLocalStorage("todos", { log: false })
```
*/
clearLocalStorage(key: string, options: Partial<Loggable>): Chainable<Storage>
/**
* Click a DOM element.
*
* @see https://on.cypress.io/click
* @example
* cy.get('button').click() // Click on button
* cy.focused().click() // Click on el with focus
* cy.contains('Welcome').click() // Click on first el containing 'Welcome'
*/
click(options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Click a DOM element at specific corner / side.
*
* @param {PositionType} position - The position where the click should be issued.
* The `center` position is the default position.
* @see https://on.cypress.io/click
* @example
* cy.get('button').click('topRight')
*/
click(position: PositionType, options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Click a DOM element at specific coordinates
*
* @param {number} x The distance in pixels from the element's left to issue the click.
* @param {number} y The distance in pixels from the element's top to issue the click.
* @see https://on.cypress.io/click
* @example
```
// The click below will be issued inside of the element
// (15px from the left and 40px from the top).
cy.get('button').click(15, 40)
```
*/
click(x: number, y: number, options?: Partial<ClickOptions>): Chainable<Subject>
/**
* `cy.clock()` overrides native global functions related to time allowing them to be controlled
* synchronously via [cy.tick()](https://on.cypress.io/tick) or the yielded clock object.
* This includes controlling:
* * `setTimeout`
* * `clearTimeout`
* * `setInterval`
* * `clearInterval`
* * `Date` Objects
*
* The clock starts at the unix epoch (timestamp of 0).
* This means that when you instantiate new Date in your application,
* it will have a time of January 1st, 1970.
*
* To restore the real clock call `.restore()`
*
* @example
* cy.clock()
* ...
* // restore the application clock
* cy.clock().then(clock => {
* clock.restore()
* })
* // or use this shortcut
* cy.clock().invoke('restore')
*
* @see https://on.cypress.io/clock
*/
clock(): Chainable<Clock>
/**
* Mocks global clock and sets current timestamp to the given value.
* Overrides all functions that deal with time.
*
* @see https://on.cypress.io/clock
* @example
* // in your app code
* $('#date').text(new Date().toJSON())
* // in the spec file
* // March 14, 2017 timestamp or Date object
* const now = new Date(2017, 2, 14).getTime()
* cy.clock(now)
* cy.visit('/index.html')
* cy.get('#date').contains('2017-03-14')
* // to restore the real clock
* cy.clock().then(clock => {
* clock.restore()
* })
* // or use this shortcut
* cy.clock().invoke('restore')
*/
clock(now: number | Date, options?: Loggable): Chainable<Clock>
/**
* Mocks global clock but only overrides specific functions.
*
* @see https://on.cypress.io/clock
* @example
* // keep current date but override "setTimeout" and "clearTimeout"
* cy.clock(null, ['setTimeout', 'clearTimeout'])
*/
clock(now: number | Date, functions?: Array<'setTimeout' | 'clearTimeout' | 'setInterval' | 'clearInterval' | 'Date'>, options?: Loggable): Chainable<Clock>
/**
* Mocks global clock and all functions.
*
* @see https://on.cypress.io/clock
* @example
* // mock clock but do not log this command
* cy.clock({ log: false })
*/
clock(options: Loggable): Chainable<Clock>
/**
* Get the first DOM element that matches the selector (whether it be itself or one of its ancestors).
*
* @see https://on.cypress.io/closest
*/
closest<K extends keyof HTMLElementTagNameMap>(selector: K, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<HTMLElementTagNameMap[K]>>
closest<E extends Node = HTMLElement>(selector: string, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
/**
* Get the DOM element containing the text.
* DOM elements can contain more than the desired text and still match.
* Additionally, Cypress prefers some DOM elements over the deepest element found.
*
* @see https://on.cypress.io/contains
* @example
* // Yield el in .nav containing 'About'
* cy.get('.nav').contains('About')
* // Yield first el in document containing 'Hello'
* cy.contains('Hello')
* // you can use regular expression
* cy.contains(/^b\w+/)
* // yields <ul>...</ul>
* cy.contains('ul', 'apples')
* // tries to find the given text for up to 1 second
* cy.contains('my text to find', {timeout: 1000})
*/
contains(content: string | number | RegExp, options?: Partial<Loggable & Timeoutable & CaseMatchable & Shadow>): Chainable<Subject>
/**
* Get the child DOM element that contains given text.
*
* @see https://on.cypress.io/contains
* @example
* // Yield el in .nav containing 'About'
* cy.get('.nav').contains('About')
*/
contains<E extends Node = HTMLElement>(content: string | number | RegExp): Chainable<JQuery<E>>
/**
* Get the DOM element with name "selector" containing the text or regular expression.
*
* @see https://on.cypress.io/contains
* @example
* // yields <ul>...</ul>
* cy.contains('ul', 'apples')
*/
contains<K extends keyof HTMLElementTagNameMap>(selector: K, text: string | number | RegExp, options?: Partial<Loggable & Timeoutable & CaseMatchable & Shadow>): Chainable<JQuery<HTMLElementTagNameMap[K]>>
/**
* Get the DOM element using CSS "selector" containing the text or regular expression.
*
* @see https://on.cypress.io/contains
* @example
* // yields <... class="foo">... apples ...</...>
* cy.contains('.foo', 'apples')
*/
contains<E extends Node = HTMLElement>(selector: string, text: string | number | RegExp, options?: Partial<Loggable & Timeoutable & CaseMatchable & Shadow>): Chainable<JQuery<E>>
/**
* Double-click a DOM element.
*
* @see https://on.cypress.io/dblclick
*/
dblclick(options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Double-click a DOM element at specific corner / side.
*
* @param {PositionType} position - The position where the click should be issued.
* The `center` position is the default position.
* @see https://on.cypress.io/dblclick
* @example
* cy.get('button').dblclick('topRight')
*/
dblclick(position: PositionType, options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Double-click a DOM element at specific coordinates
*
* @param {number} x The distance in pixels from the element's left to issue the click.
* @param {number} y The distance in pixels from the element's top to issue the click.
* @see https://on.cypress.io/dblclick
* @example
```
// The click below will be issued inside of the element
// (15px from the left and 40px from the top).
cy.get('button').dblclick(15, 40)
```
*/
dblclick(x: number, y: number, options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Right-click a DOM element.
*
* @see https://on.cypress.io/rightclick
*/
rightclick(options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Right-click a DOM element at specific corner / side.
*
* @param {PositionType} position - The position where the click should be issued.
* The `center` position is the default position.
* @see https://on.cypress.io/click
* @example
* cy.get('button').rightclick('topRight')
*/
rightclick(position: PositionType, options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Right-click a DOM element at specific coordinates
*
* @param {number} x The distance in pixels from the element's left to issue the click.
* @param {number} y The distance in pixels from the element's top to issue the click.
* @see https://on.cypress.io/rightclick
* @example
```
// The click below will be issued inside of the element
// (15px from the left and 40px from the top).
cy.get('button').rightclick(15, 40)
```
*/
rightclick(x: number, y: number, options?: Partial<ClickOptions>): Chainable<Subject>
/**
* Set a debugger and log what the previous command yields.
*
* @see https://on.cypress.io/debug
*/
debug(options?: Partial<Loggable>): Chainable<Subject>
/**
* Save/Restore browser Cookies, LocalStorage, and SessionStorage data resulting from the supplied `setup` function.
*
* @see https://on.cypress.io/session
*/
session(id: string | object, setup: () => void, options?: SessionOptions): Chainable<null>
/**
* Get the window.document of the page that is currently active.
*
* @see https://on.cypress.io/document
* @example
* cy.document()
* .its('contentType')
* .should('eq', 'text/html')
*/
document(options?: Partial<Loggable & Timeoutable>): Chainable<Document>
/**
* Iterate through an array like structure (arrays or objects with a length property).
*
* @see https://on.cypress.io/each
*/
each<E extends Node = HTMLElement>(fn: (element: JQuery<E>, index: number, $list: E[]) => void): Chainable<JQuery<E>> // Can't properly infer type without breaking down Chainable
each(fn: (item: any, index: number, $list: any[]) => void): Chainable<Subject>
/**
* End a chain of commands
*
* @see https://on.cypress.io/end
*/
end(): Chainable<null>
/**
* Get A DOM element at a specific index in an array of elements.
*
* @see https://on.cypress.io/eq
* @param {Number} index A number indicating the index to find the element at within an array of elements. A negative number counts index from the end of the list.
* @example
* cy.get('tbody>tr').eq(0) // Yield first 'tr' in 'tbody'
* cy.get('ul>li').eq('4') // Yield fifth 'li' in 'ul'
* cy.get('li').eq(-2) // Yields second from last 'li' element
*/
eq<E extends Node = HTMLElement>(index: number, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
/**
* Execute a system command.
* @see https://on.cypress.io/exec
*/
exec(command: string, options?: Partial<ExecOptions>): Chainable<Exec>
/**
* Get the DOM elements that match a specific selector. Opposite of `.not()`
*
* @see https://on.cypress.io/filter
*/
filter<K extends keyof HTMLElementTagNameMap>(selector: K, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<HTMLElementTagNameMap[K]>> // automatically returns the correct HTMLElement type
/**
* Get the DOM elements that match a specific selector. Opposite of `.not()`
*
* @see https://on.cypress.io/filter
*/
filter<E extends Node = HTMLElement>(selector: string, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
/**
* Get the DOM elements that match a specific selector. Opposite of `.not()`
*
* @see https://on.cypress.io/filter
*/
filter<E extends Node = HTMLElement>(fn: (index: number, element: E) => boolean, options?: Partial<Loggable & Timeoutable>): Chainable<JQuery<E>>
/**
* Get the descendent DOM elements of a specific selector.
*
* @see https://on.cypress.io/find
* @example
* cy.get('.article').find('footer') // Yield 'footer' within '.article'
*/
find<K extends keyof HTMLElementTagNameMap>(selector: K, options?: Partial<Loggable & Timeoutable & Shadow>): Chainable<JQuery<HTMLElementTagNameMap[K]>>
/**
* Finds the descendent DOM elements with the given selector.
*
* @see https://on.cypress.io/find
* @example
* // Find the li's within the nav
* cy.get('.left-nav>.nav').find('>li')
*/
find<E extends Node = HTMLElement>(selector: string, options?: Partial<Loggable & Timeoutable & Shadow>): Chainable<JQuery<E>>
/**
* Get the first DOM element within a set of DOM elements.
*
* @see https://on.cypress.io/first
*/
first(options?: Partial<Loggable & Timeoutable>): Chainable<Subject>
/**
* Load a fixed set of data located in a file.
*
* @see https://on.cypress.io/fixture
*/
fixture<Contents = any>(path: string, options?: Partial<Timeoutable>): Chainable<Contents> // no log?
/**
* Load a fixed set of data located in a file with given encoding.
*
* @see https://on.cypress.io/fixture
*/
fixture<Contents = any>(path: string, encoding: Encodings, options?: Partial<Timeoutable>): Chainable<Contents> // no log?
/**
* Focus on a DOM element.
*
* @see https://on.cypress.io/focus
* @example
* cy.get('input').first().focus() // Focus on the first input
*/
focus(options?: Partial<Loggable & Timeoutable>): Chainable<Subject>
/**
* Get the DOM element that is currently focused.
*
* @see https://on.cypress.io/focused
* @example
* // Get the element that is focused
* cy.focused().then(function($el) {
* // do something with $el
* })
* // Blur the element with focus
* cy.focused().blur()
* // Make an assertion on the focused element
* cy.focused().should('have.attr', 'name', 'username')
*/
focused(options?: Partial<Loggable & Timeoutable>): Chainable<JQuery>
/**
* Get one or more DOM elements by node name: input, button, etc.
* @see https://on.cypress.io/get
* @example
* cy.get('input').should('be.disabled')
* cy.get('button').should('be.visible')
*/
get<K extends keyof HTMLElementTagNameMap>(selector: K, options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<HTMLElementTagNameMap[K]>>
/**
* Get one or more DOM elements by selector.
* The querying behavior of this command matches exactly how $(…) works in jQuery.
* @see https://on.cypress.io/get
* @example
* cy.get('.list>li') // Yield the <li>'s in <.list>
* cy.get('ul li:first').should('have.class', 'active')
* cy.get('.dropdown-menu').c