---
id: api/commands/invoke
title: invoke | Cypress Documentation
description: Invoke a function on the previously yielded subject in Cypress.
section: api
source_path: docs/api/commands/invoke.mdx
version: 204dffbf7fbb64b1fe8343a54ddcd869cc275f1f
updated_at: '2026-05-12T20:33:17.938Z'
---
# invoke

Invoke a function on the previously yielded subject.

If you want to get a property that is not a function on the previously yielded subject, use [`.its()`](/llm/markdown/api/commands/its.md).

If you chain further commands off of `.invoke()`, it will be called multiple times. If you only want the method to be called once, end your chain with `.invoke()` and start fresh with `cy` afterwards.

## Syntax

```
.invoke(functionName).invoke(options, functionName).invoke(functionName, args...).invoke(options, functionName, args...)
```

### Usage

**Correct Usage**

```
cy.get('.input').invoke('val').should('eq', 'foo') // Invoke the 'val' functioncy.get('.modal').invoke('show') // Invoke the jQuery 'show' functioncy.wrap({ animate: fn }).invoke('animate') // Invoke the 'animate' function
```

**Incorrect Usage**

```
cy.invoke('convert') // Errors, cannot be chained off 'cy'cy.wrap({ name: 'Jane' }).invoke('name') // Errors, 'name' is not a functioncy.wrap({ animate: fn })  .invoke('animate')  .then(() => {}) // 'animate' will be called multiple times
```

### Arguments

**functionName _(String, Number)_**

Name of function to be invoked.

**options _(Object)_**

Pass in an options object to change the default behavior of `.invoke()`.

| Option | Default | Description |
| --- | --- | --- |
| `log` | `true` | Displays the command in the [Command log](/llm/markdown/app/core-concepts/open-mode.md#Command-Log) |
| `timeout` | [`defaultCommandTimeout`](/llm/markdown/app/references/configuration.md#Timeouts) | Time to wait for `.invoke()` to resolve before [timing out](#Timeouts) |

args...\*\*

Additional arguments to be given to the function call. There is no limit to the number of arguments.

### Yields [Learn about subject management](/llm/markdown/app/core-concepts/introduction-to-cypress.md#Subject-Management)

*   `.invoke()` yields the return value of the method.
*   `.invoke()` is a query, and it is _safe_ to chain further commands.
*   If you chain additional commands off of `.invoke()`, the function will be called multiple times!

## Examples

### Function

#### Assert on a function's return value

```
const fn = () => {  return 'bar'}cy.wrap({ foo: fn }).invoke('foo').should('eq', 'bar') // true
```

#### Use `.invoke()` to test HTML content

[Check out our example recipe where we use `cy.invoke('text')` to test against HTML content in 'Bootstrapping your App'](/llm/markdown/app/references/recipes.md#Server-Communication)

#### Properties that are functions are invoked

In the example below, we use `.invoke()` to force a hidden div to be `'display: block'` so we can interact with its children elements.

```
cy.get('div.container')  .should('be.hidden') // element is hidden  .invoke('show') // call jquery method 'show' on the '.container'  .should('be.visible') // element is visible now  .find('input') // drill down into a child "input" element  .type('Cypress is great') // and type text
```

#### Use `.invoke('show')` and `.invoke('trigger')`

[Check out our example recipe where we use `cy.invoke('show')` and `cy.invoke('trigger')` to click an element that is only visible on hover](/llm/markdown/app/references/recipes.md#Testing-the-DOM)

### Function with Arguments

#### Send specific arguments to the function

```
const fn = (a, b, c) => {  return a + b + c}cy.wrap({ sum: fn })  .invoke('sum', 2, 4, 6)  .should('be.gt', 10) // true  .and('be.lt', 20) // true
```

#### Use `cy.invoke('removeAttr', 'target')` to get around new tab

[Check out our example recipe where we use `cy.invoke('removeAttr', 'target')` to test clicking on a link without opening in a new tab](/llm/markdown/app/references/recipes.md#Testing-the-DOM)

#### Arguments are automatically forwarded to the function

```
cy.get('img').invoke('attr', 'src').should('include', 'myLogo')
```

### Arrays

In the above examples, the subject was an object, but `cy.invoke` also works on arrays and allows using numerical index to pick a function to run.

```
const reverse = (s) => Cypress._.reverse(s)const double = (n) => n * n// picks function with index 1 and calls it with argument 4cy.wrap([reverse, double]).invoke(1, 4).should('eq', 16)
```

### jQuery method

If the parent command yields a jQuery element, we can invoke a jQuery method, like `attr`, `text`, or `val`. To confirm the element's `id` attribute for example:

```
<div id="code-snippet">The code example</div>
```

```
cy.contains('The code example')  .invoke('attr', 'id')  .should('equal', 'code-snippet')
```

**Tip:** Cypress has a built-in Chai-jQuery assertion to confirm the attribute. The above example can be written simply as:

```
cy.contains('The code example').should('have.attr', 'id', 'code-snippet')
```

## Notes

### Third Party Plugins

#### Using a Kendo DropDown

If you are using `jQuery` then the `jQuery` wrapped elements will automatically have your 3rd party plugins available to be called.

```
cy.get('input')  .invoke('getKendoDropDownList')  .then((dropDownList) => {    // yields the return of $input.getKendoDropDownList()    return dropDownList.select('apples')  })
```

We can rewrite the previous example in a more terse way and add an assertion.

```
cy.get('input')  .invoke('getKendoDropDownList')  .invoke('select', 'apples')  .invoke('val')  .should('match', /apples/)
```

### Retries

`.invoke()` automatically retries invoking the specified method until the returned value satisfies the attached assertions. The example below passes after 1 second.

```
let message = 'hello'const english = {  greeting() {    return message  },}setTimeout(() => {  message = 'bye'}, 1000)// initially the english.greeting() returns "hello" failing the assertion.// .invoke('greeting') tries again and again until after 1 second// the returned message becomes "bye" and the assertion passescy.wrap(english).invoke('greeting').should('equal', 'bye')
```

## Rules

### Requirements [Learn about chaining commands](/llm/markdown/app/core-concepts/introduction-to-cypress.md#Chains-of-Commands)

*   `.invoke()` requires being chained off a previous command.

### Assertions [Learn about assertions](/llm/markdown/app/core-concepts/introduction-to-cypress.md#Assertions)

*   `.invoke()` will wait for the `function` to exist on the subject before running.
*   `.invoke()` will throw an error if the invoked `function` returns a promise. If you want to invoke a function that returns a promise, use [`.then()`](/llm/markdown/api/commands/then.md) instead.
*   `.invoke()` will automatically [retry](/llm/markdown/app/core-concepts/retry-ability.md) until all chained assertions have passed.

### Timeouts [Learn about timeouts](/llm/markdown/app/core-concepts/introduction-to-cypress.md#Timeouts)

*   `.invoke()` can time out waiting for assertions you've added to pass.

## Command Log

**_Invoke jQuery show method on element_**

```
cy.get('.connectors-div')  .should('be.hidden')  .invoke('show')  .should('be.visible')
```

The commands above will display in the Command Log as:

When clicking on `invoke` within the command log, the console outputs the following:

## History

| Version | Changes |
| --- | --- |
| [12.0.0](/llm/markdown/app/references/changelog.md#12-0-0) | `.invoke()` no longer supports promises or async functions |
| [3.8.0](/llm/markdown/app/references/changelog.md#3-8-0) | Added support for `options` argument |
| [3.7.0](/llm/markdown/app/references/changelog.md#3-7-0) | Added support for arguments of type Number for `functionName` |

## See also

*   [`.its()`](/llm/markdown/api/commands/its.md)
*   [`.then()`](/llm/markdown/api/commands/then.md)
*   [`cy.wrap()`](/llm/markdown/api/commands/wrap.md)
