Skip to content

fix: replace isDisplayed() with viewport check in autoScrollIntoView() (CP: 9.6) (#2164) (CP: 9.5)#2166

Merged
mshabarov merged 1 commit into9.5from
cherry-pick-2164-to-9.5-1772790112219
Mar 9, 2026
Merged

fix: replace isDisplayed() with viewport check in autoScrollIntoView() (CP: 9.6) (#2164) (CP: 9.5)#2166
mshabarov merged 1 commit into9.5from
cherry-pick-2164-to-9.5-1772790112219

Conversation

@vaadin-bot
Copy link
Collaborator

This PR cherry-picks changes from the original PR #2164 to branch 9.5.

Original PR description

doubleClick(), click(x,y) and contextClick() threw
MoveTargetOutOfBoundsException when the target element was inside a
scrollable container (e.g. vaadin-grid) but scrolled out of the visible
area. The root cause was that autoScrollIntoView() used
wrappedElement.isDisplayed() which returns true for elements that are
in the DOM but positioned outside the viewport.

Replace the check with isElementInViewport(), a JavaScript-based
visibility test that verifies the element's bounding rect intersects
the viewport and is not clipped by any scrollable ancestor. When the
element is outside the viewport, call scrollIntoView({nearest}) to
bring it into view before Selenium's Actions.moveToElement reads the
element coordinates.

Also add a scrollIntoView(Map) public overload accepting scroll
options.

Rename autoScrollIntoView() to ensureVisible() and
autoScrollIntoViewport() to ensureInteractable() to better
communicate intent rather than mechanism.

Fixes #2156

…) (CP: 9.6) (#2164)

* fix: refactor `autoScrollIntoView()` feature to check `isDisplayed()` or viewport based on the use case (#2158)

* fix: replace `isDisplayed()` with viewport check in `autoScrollIntoView()`

`doubleClick()`, `click(x,y)` and `contextClick()` threw
`MoveTargetOutOfBoundsException` when the target element was inside a
scrollable container (e.g. vaadin-grid) but scrolled out of the visible
area. The root cause was that `autoScrollIntoView()` used
`wrappedElement.isDisplayed()` which returns true for elements that are
in the DOM but positioned outside the viewport.

Replace the check with `isElementInViewport()`, a JavaScript-based
visibility test that verifies the element's bounding rect intersects
the viewport and is not clipped by any scrollable ancestor. When the
element is outside the viewport, call `scrollIntoView({nearest})` to
bring it into view before Selenium's `Actions.moveToElement` reads the
element coordinates.

Also add a `scrollIntoView(Map)` public overload accepting scroll
options.

Fixes #2156

* refactor: rename scroll helpers to goal-oriented names in `TestBenchElement`

Rename `autoScrollIntoView()` to `ensureVisible()` and
`autoScrollIntoViewport()` to `ensureInteractable()` to better
communicate intent rather than mechanism.

* use Selenium API to scroll into viewport

* fix: do not use getCoordinates().inViewPort() to scroll into view (#2161)

Calling getCoordinates().inViewPort() seems to always scroll even if the element
is alredy visibile and interactable. This migth cause issue in existing tests.
This change partially reverts the previous fix to just use scrollIntoView after
viewport check.
@mshabarov mshabarov merged commit 7a33d66 into 9.5 Mar 9, 2026
4 checks passed
@mshabarov mshabarov deleted the cherry-pick-2164-to-9.5-1772790112219 branch March 9, 2026 12:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants