Skip to content

Fix Locator.SetVisibility(Hidden).WaitAsync() resolving immediately - #3514

Merged
kblok merged 2 commits into
masterfrom
fix-locator-wait-hidden-visibility
Jul 9, 2026
Merged

kblok merged 2 commits into
masterfrom
fix-locator-wait-hidden-visibility

Conversation

@kblok

@kblok kblok commented Jul 8, 2026

Copy link
Copy Markdown
Member

Fixes #3513. NodeLocator was setting Visible = false for VisibilityOption.Hidden instead of the separate Hidden = true flag on WaitForSelectorOptions. Since the underlying QueryHandler.WaitForAsync only checks visibility when Visible || Hidden is true, that flag never got set for the Hidden case, so the wait resolved as soon as the element existed in the DOM — regardless of whether it was actually visible.

Fixed by routing Hidden through the correct flag. That also exposed a second bug: waiting for Hidden can legitimately resolve to a null handle when the element is removed from the DOM entirely (documented behavior of WaitForSelectorAsync), but NodeLocator and a few call sites in Locator treated that as an error/NRE instead of success. Handled that too, since it's the same feature area and would've broken the moment someone waited for an element to disappear rather than just go display: none.

Added regression tests covering both the CSS-hide and DOM-removal flavors of "hidden."

Test plan

  • BROWSER=CHROME PROTOCOL=cdp dotnet test --filter "FullyQualifiedName~LocatorTests" — 39/39 passed
  • Full suite run: 1357/1359 passed, the only 2 failures are pre-existing/unrelated (a retina-display screenshot pixel-diff test and a flaky incognito service-worker test)

kblok and others added 2 commits July 8, 2026 17:01
…instead of waiting

NodeLocator was setting Visible=false for the Hidden case instead of the
separate Hidden=true flag, so the underlying wait never actually checked
visibility and resolved as soon as the element existed in the DOM. Fixed
by routing through the correct Hidden flag, and handled the resulting
null-handle case (element removed from DOM) as a valid resolution instead
of an error, guarding the downstream WaitAsync/PerformActionAsync call
sites against it.

Fixes #3513

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@kblok
kblok merged commit 9fd56df into master Jul 9, 2026
36 of 39 checks passed
@kblok
kblok deleted the fix-locator-wait-hidden-visibility branch July 9, 2026 12:34
sondresjolyst pushed a commit to sondresjolyst/garge-api that referenced this pull request Jul 20, 2026
Updated [PuppeteerSharp](https://github.com/hardkoded/puppeteer-sharp)
from 25.3.1 to 25.3.3.

<details>
<summary>Release notes</summary>

_Sourced from [PuppeteerSharp's
releases](https://github.com/hardkoded/puppeteer-sharp/releases)._

## 25.3.3

## What's Changed
* Fix Native AOT crash from missing JsonSerializable registrations by
@​kblok in hardkoded/puppeteer-sharp#3516


**Full Changelog**:
hardkoded/puppeteer-sharp@v25.3.2...v25.3.3

## 25.3.2

## What's Changed
* Fix Locator.SetVisibility(Hidden).WaitAsync() resolving immediately by
@​kblok in hardkoded/puppeteer-sharp#3514


**Full Changelog**:
hardkoded/puppeteer-sharp@v25.3.1...v25.3.2

Commits viewable in [compare
view](hardkoded/puppeteer-sharp@v25.3.1...v25.3.3).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=PuppeteerSharp&package-manager=nuget&previous-version=25.3.1&new-version=25.3.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
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.

Locator.SetVisibility(VisibilityOption.Hidden).WaitAsync() returns immediately instead of waiting for the element to become hidden

1 participant