Skip to main content
Cypress App

dblclick

Double-click a DOM element.

It is unsafe to chain further commands that rely on the subject after .dblclick().

Syntax​

.dblclick()
.dblclick(options)
.dblclick(position)
.dblclick(position, options)
.dblclick(x, y)
.dblclick(x, y, options)

Usage​

Correct Usage

cy.get('button').dblclick() // Double-click on button
cy.focused().dblclick() // Double-click on element with focus
cy.contains('Welcome').dblclick() // Double-click on first element containing 'Welcome'

Incorrect Usage

cy.dblclick('button') // Errors, cannot be chained off 'cy'
cy.window().dblclick() // Errors, 'window' does not yield DOM element

Arguments​

position (String)

The position where Cypress issues the double-click. The center position is the default position. Valid positions are topLeft, top, topRight, left, center, right, bottomLeft, bottom, and bottomRight.

Diagram of the nine positions on an element's border box: topLeft, top, and topRight along the top edge; left, center, and right across the middle; and bottomLeft, bottom, and bottomRight along the bottom edge. Edge and corner positions sit just inside the outer edge of the border box, on the border when the element has one, and never in the margin. center is the default.

x (Number)

The distance in pixels from the element's left to issue the double-click.

y (Number)

The distance in pixels from the element's top to issue the double-click.

options (Object)

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

OptionDefaultDescription
altKeyfalseActivates the alt key (option key for Mac). Aliases: optionKey.
animationDistanceThresholdanimationDistanceThresholdThe distance in pixels an element must exceed over time to be considered animating.
ctrlKeyfalseActivates the control key. Aliases: controlKey.
logtrueDisplays the command in the Command Log
forcefalseForces the action, disables waiting for actionability
metaKeyfalseActivates the meta key (Windows key or command key for Mac). Aliases: commandKey, cmdKey.
multipletrueSerially double-click multiple elements
scrollBehaviorscrollBehaviorViewport position to where an element should be scrolled before executing the command. Accepts a single alignment, a per-axis { block, inline } object, or false.
shiftKeyfalseActivates the shift key.
timeoutdefaultCommandTimeoutTime to wait for .dblclick() to resolve before timing out
waitForAnimationswaitForAnimationsWhether to wait for elements to finish animating before executing the command.

Yields ​

  • .dblclick() yields the same subject it was given.
  • It is unsafe to chain further commands that rely on the subject after .dblclick().

Examples​

No Args​

cy.get('a#nav1').dblclick() // yields the <a>

Double-click a label to edit an item inline​

Many apps turn a label, table cell, or file name into an input when you double-click it. The double-click usually replaces the element, so start a new chain from cy to reach the input instead of chaining off .dblclick().

cy.get('[data-cy=todo-label]').first().dblclick()
cy.get('[data-cy=todo-edit]').clear().type('Buy oat milk{enter}')
cy.get('[data-cy=todo-label]').first().should('have.text', 'Buy oat milk')

Double-click one element out of several matches​

.dblclick() double-clicks every element in its subject by default, so a selector that matches several rows puts all of them into edit mode without an error. Narrow the query to the element you want with .eq(), .first(), or cy.contains() with a selector and text.

cy.get('[data-cy=row]').eq(2).dblclick()
cy.contains('[data-cy=file]', 'report.pdf').dblclick()

Wait for the request a double-click sends​

Register a cy.intercept() before the double-click, then cy.wait() on its alias so the test continues only after the request completes.

cy.intercept('GET', '/api/files/*').as('openFile')
cy.contains('[data-cy=file]', 'report.pdf').dblclick()
cy.wait('@openFile')
cy.get('[data-cy=preview]').should('be.visible')

Test an element that handles both click and double-click​

Cypress sends two click events before the dblclick event (see Events), so a click handler runs twice. Apps that respond to both often wait briefly after a click to see whether a second one follows. If yours uses a timer like that, freeze it with cy.clock(), then advance it past your app's delay with cy.tick(). The example below assumes a delay under 300 milliseconds. Without the tick, the not.have.class assertion passes before the timer fires, so it can't catch a single-click action that runs by mistake.

cy.clock()
cy.get('[data-cy=photo]').dblclick()
cy.tick(300)
cy.get('[data-cy=lightbox]').should('be.visible')
cy.get('[data-cy=photo]').should('not.have.class', 'selected')

Position​

Specify a position of the element to double-click​

Double-click the bottom center of the button.

cy.get('button').dblclick('bottom')

Coordinates​

Specify coordinates relative to the top-left corner​

Cypress issues the double-click below inside of the element (30px from the left and 10px from the top).

cy.get('button').dblclick(30, 10)

Double-click a precise spot on a map or canvas​

Coordinates matter when the double-click position changes the result, such as zooming a map in on the point under the cursor.

cy.get('[data-cy=map]').dblclick(200, 150)
cy.get('[data-cy=zoom-level]').should('have.text', '4')

Options​

Force a double-click regardless of its actionable state​

Forcing a double-click overrides the actionable checks Cypress applies and fires the events. On a disabled element, a forced double-click fires both click sequences but not the dblclick event, so a dblclick handler on a disabled element never runs.

cy.get('button').dblclick({ force: true })

Force a double-click with a position argument​

cy.get('button').dblclick('topRight', { force: true })

Force a double-click with relative coordinates​

cy.get('button').dblclick(60, 60, { force: true })

Double-click every element that matches a selector​

Unlike .click(), .dblclick() defaults to { multiple: true }. When the subject contains several elements, Cypress double-clicks each one in turn, gives each double-click its own full timeout, and logs each one to the Command Log.

cy.get('[data-cy=todo-label]').dblclick() // double-clicks every label

Pass { multiple: false } as a guard when a selector should match exactly one element. If it ever matches more, .dblclick() fails the test instead of double-clicking all of them.

cy.get('[data-cy=current-todo]').dblclick({ multiple: false })

Double-click with key combinations​

Pass key modifiers to .dblclick() to hold down keys while it double-clicks, such as ALT + double-click.

info

You can also use key combinations during .type(), which can hold keys down across multiple commands. See Key Combinations.

The following keys can be combined with .dblclick() through the options.

OptionNotes
altKeyActivates the alt key (option key for Mac). Aliases: optionKey.
ctrlKeyActivates the control key. Aliases: controlKey.
metaKeyActivates the meta key (Windows key or command key for Mac). Aliases: commandKey, cmdKey.
shiftKeyActivates the shift key.
Alt + double-click the first list item​
// execute ALT + dblclick on the first <li>
cy.get('li').first().dblclick({
altKey: true,
})

Notes​

Actionability​

The element must first reach actionability​

.dblclick() is an "action command" that follows all the rules of Actionability.

Events​

A double-click fires two clicks, then a dblclick​

Cypress fires the full .click() event sequence twice, then a dblclick event, matching what a browser sends for a real double-click. The mouse events in the first click have a detail of 1. The mouse events in the second click, and the dblclick event, have a detail of 2. The pointerdown and pointerup events have a detail of 0.

Because each click follows the .click() rules, the focus and cancellation behavior of .click() applies to both clicks.

Text selection​

A double-click does not select the word you double-click​

In a browser, double-clicking a word selects it. Cypress fires the double-click as simulated events, which don't trigger the browser's native text selection. .dblclick() doesn't select the word you double-click, in page text or in an input, and it leaves any text that was already selected in place. To select the text in an input or textarea, use .type('{selectall}').

cy.get('[data-cy=title]').type('{selectall}')

Rules​

Requirements ​

  • .dblclick() requires being chained off a command that yields DOM element(s).
  • .dblclick() cannot be called on a <select> element. Use .select() to change its value.

Assertions ​

  • .dblclick() automatically waits for the element to reach an actionable state.
  • .dblclick() itself is not retried. It fires once when the element is actionable. Assertions chained after .dblclick() are retried until they pass or time out. See Only queries are retried.

Timeouts ​

  • .dblclick() can time out waiting for the element to reach an actionable state.
  • .dblclick() can time out waiting for assertions you've added to pass.

Command Log​

Double-click a div

cy.get('.action-div').dblclick()

The commands above display in the Command Log as:

Command Log showing a get command for .action-div followed by a dblclick command

When you click dblclick in the Command Log, the console outputs the following:

DevTools console showing the dblclick command details and a Mouse Events table of the hover events, two full click sequences, and a dblclick event

History​

VersionChanges
15.20.0Option scrollBehavior now accepts a per-axis { block, inline } object and the 'start' and 'end' alignments
6.1.0Added option scrollBehavior
5.0.0Added options altKey, ctrlKey, metaKey, and shiftKey
3.5.0.dblclick() now follows the same actionability checks as .click()
3.5.0Added support for options force and multiple
3.5.0Added support for position, x, and y arguments
3.5.0Added sending mouseover, mousemove, mouseout, pointerdown, pointerup, and pointermove during .dblclick()

See also​