From 208af647dee1f19cda541e32e88f091cb0774e26 Mon Sep 17 00:00:00 2001 From: Ben Kucera <14625260+Bkucera@users.noreply.github.com> Date: Tue, 29 Oct 2019 15:26:37 -0400 Subject: [PATCH] fix actionability not erroring on covered element --- packages/driver/src/cy/actionability.coffee | 11 +++++++++-- packages/driver/src/cy/retries.coffee | 5 ++++- .../integration/commands/actions/click_spec.js | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/driver/src/cy/actionability.coffee b/packages/driver/src/cy/actionability.coffee index b81bc987fa..d00a90b83e 100644 --- a/packages/driver/src/cy/actionability.coffee +++ b/packages/driver/src/cy/actionability.coffee @@ -1,6 +1,7 @@ _ = require("lodash") $ = require("jquery") Promise = require("bluebird") +debug = require('debug')('cypress:driver:actionability') $dom = require("../dom") $utils = require("../cypress/utils") @@ -49,8 +50,10 @@ ensureElIsNotCovered = (cy, win, $el, fromElViewport, options, log, onScroll) -> ## figure out the deepest element we are about to interact ## with at these coordinates $elAtCoords = getElementAtPointFromViewport(fromElViewport) - + debug('elAtCoords', $elAtCoords) + debug('el has pointer-events none?') cy.ensureElDoesNotHaveCSS($el, 'pointer-events', 'none', log) + debug('is descendent of elAtCoords?') cy.ensureDescendents($el, $elAtCoords, log) return $elAtCoords @@ -65,6 +68,8 @@ ensureElIsNotCovered = (cy, win, $el, fromElViewport, options, log, onScroll) -> ## from underneath this fixed position element until we can't ## anymore $fixed = getFixedOrStickyEl($elAtCoords) + + debug('elAtCoords is fixed', !!$fixed) ## if we dont have a fixed position ## then just bail, cuz we need to retry async @@ -161,7 +166,9 @@ ensureElIsNotCovered = (cy, win, $el, fromElViewport, options, log, onScroll) -> ## and possibly recursively scroll past it ## if we haven't see it before - possiblyScrollMultipleTimes($fixed) + return possiblyScrollMultipleTimes($fixed) + + throw err else scrollContainers(scrollables) diff --git a/packages/driver/src/cy/retries.coffee b/packages/driver/src/cy/retries.coffee index ca79597203..41f8d4d704 100644 --- a/packages/driver/src/cy/retries.coffee +++ b/packages/driver/src/cy/retries.coffee @@ -35,7 +35,10 @@ create = (Cypress, state, timeout, clearTimeout, whenStable, finishAssertions) - ## correctly handles not rewrapping errors so that stack ## traces are correctly displayed if debug.enabled and error and not CypressErrorRe.test(error.name) - debug('retrying due to caught error...') + if debug.prevError && debug.prevError is error.message + debug('exiting due to catching same error twice...') + throw error + debug.prevError = error.message console.error(error) interval = options.interval ? options._interval diff --git a/packages/driver/test/cypress/integration/commands/actions/click_spec.js b/packages/driver/test/cypress/integration/commands/actions/click_spec.js index 9e2215eb06..362c01652d 100644 --- a/packages/driver/test/cypress/integration/commands/actions/click_spec.js +++ b/packages/driver/test/cypress/integration/commands/actions/click_spec.js @@ -312,6 +312,22 @@ describe('src/cy/commands/actions/click', () => { cy.getAll('el', 'focus focusin').each(shouldBeCalledOnce) }) + it('does not attempt to click element outside viewport', (done) => { + cy.on('fail', (err) => { + expect(err.message).contain('id="email-with-value"') + expect(err.message).contain('hidden from view') + done() + }) + + cy.$$('#tabindex').css(overlayStyle) + cy.get('#email-with-value').click() + }) + + it('can click element outside viewport with force:true', () => { + cy.$$('#tabindex').css(overlayStyle) + cy.get('#email-with-value').click() + }) + it('does not fire a focus, mouseup, or click event when element has been removed on mousedown', () => { const $btn = cy.$$('button:first')