From 80783fef5a298d2c57f64415f1882d0b051625ef Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Fri, 14 Jun 2024 11:14:33 +0200 Subject: [PATCH] fix: ensure selector parser falls back to CSS (#12585) --- .../src/common/GetQueryHandler.ts | 24 ++++++++++++------- test/src/queryhandler.spec.ts | 10 ++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/puppeteer-core/src/common/GetQueryHandler.ts b/packages/puppeteer-core/src/common/GetQueryHandler.ts index 9172227575b..08c63fb14f1 100644 --- a/packages/puppeteer-core/src/common/GetQueryHandler.ts +++ b/packages/puppeteer-core/src/common/GetQueryHandler.ts @@ -52,17 +52,25 @@ export function getQueryHandlerAndSelector(selector: string): { } } } - const [pSelector, isPureCSS, hasPseudoClasses] = parsePSelectors(selector); - if (isPureCSS) { + try { + const [pSelector, isPureCSS, hasPseudoClasses] = parsePSelectors(selector); + if (isPureCSS) { + return { + updatedSelector: selector, + selectorHasPseudoClasses: hasPseudoClasses, + QueryHandler: CSSQueryHandler, + }; + } + return { + updatedSelector: JSON.stringify(pSelector), + selectorHasPseudoClasses: hasPseudoClasses, + QueryHandler: PQueryHandler, + }; + } catch { return { updatedSelector: selector, - selectorHasPseudoClasses: hasPseudoClasses, + selectorHasPseudoClasses: false, QueryHandler: CSSQueryHandler, }; } - return { - updatedSelector: JSON.stringify(pSelector), - selectorHasPseudoClasses: hasPseudoClasses, - QueryHandler: PQueryHandler, - }; } diff --git a/test/src/queryhandler.spec.ts b/test/src/queryhandler.spec.ts index 05f201a9be0..aecffffdefb 100644 --- a/test/src/queryhandler.spec.ts +++ b/test/src/queryhandler.spec.ts @@ -358,12 +358,22 @@ describe('Query handler tests', function () { }) ).toBeTruthy(); + using root = await page.$('div'); + using button = await root!.$('& > button'); + assert(button, 'Could not find element'); + expect( + await button.evaluate(element => { + return element.id === 'b'; + }) + ).toBeTruthy(); + // Should parse more complex CSS selectors. Listing a few problematic // cases from bug reports. for (const selector of [ '.user_row[data-user-id="\\38 "]:not(.deactivated_user)', `input[value='Search']:not([class='hidden'])`, `[data-test-id^="test-"]:not([data-test-id^="test-foo"])`, + `& > table`, ]) { await page.$$(selector); }