From 2ae21368101838e8174fc695e81474dbd9d2aada Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 3 Nov 2021 07:35:01 -0800 Subject: [PATCH] chore: do not carry selector next to parsed selector (#10004) --- .../src/server/common/selectorParser.ts | 12 ++++++++---- .../src/server/injected/injectedScript.ts | 4 ++-- packages/playwright-core/src/server/selectors.ts | 2 -- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/playwright-core/src/server/common/selectorParser.ts b/packages/playwright-core/src/server/common/selectorParser.ts index 7d0ae32a85..e0c46dd3c2 100644 --- a/packages/playwright-core/src/server/common/selectorParser.ts +++ b/packages/playwright-core/src/server/common/selectorParser.ts @@ -19,10 +19,10 @@ import { CSSComplexSelectorList, parseCSS } from './cssParser'; export type ParsedSelectorPart = { name: string, body: string | CSSComplexSelectorList, + source: string, }; export type ParsedSelector = { - selector: string, parts: ParsedSelectorPart[], capture?: number, }; @@ -43,18 +43,22 @@ export function parseSelector(selector: string): ParsedSelector { const parsedCSS = parseCSS(part.body, customCSSNames); return { name: 'css', - body: parsedCSS.selector + body: parsedCSS.selector, + source: part.body }; } - return part; + return { ...part, source: part.body }; }); return { - selector, capture: result.capture, parts }; } +export function stringifySelector(selector: ParsedSelector): string { + return selector.parts.map((p, i) => `${i === selector.capture ? '*' : ''}${p.name}=${p.source}`).join(' >> '); +} + function parseSelectorString(selector: string): ParsedSelectorStrings { let index = 0; let quote: string | undefined; diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index f0be9a0e6c..9206e9c92d 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -18,7 +18,7 @@ import { SelectorEngine, SelectorRoot } from './selectorEngine'; import { XPathEngine } from './xpathSelectorEngine'; import { ReactEngine } from './reactSelectorEngine'; import { VueEngine } from './vueSelectorEngine'; -import { ParsedSelector, ParsedSelectorPart, parseSelector } from '../common/selectorParser'; +import { ParsedSelector, ParsedSelectorPart, parseSelector, stringifySelector } from '../common/selectorParser'; import { SelectorEvaluatorImpl, isVisible, parentElementOrShadowHost, elementMatchesText, TextMatcher, createRegexTextMatcher, createStrictTextMatcher, createLaxTextMatcher } from './selectorEvaluator'; import { CSSComplexSelectorList } from '../common/cssParser'; import { generateSelector } from './selectorGenerator'; @@ -757,7 +757,7 @@ export class InjectedScript { const lines = infos.map((info, i) => `\n ${i + 1}) ${info.preview} aka playwright.$("${info.selector}")`); if (infos.length < matches.length) lines.push('\n ...'); - return this.createStacklessError(`strict mode violation: "${selector.selector}" resolved to ${matches.length} elements:${lines.join('')}\n`); + return this.createStacklessError(`strict mode violation: "${stringifySelector(selector)}" resolved to ${matches.length} elements:${lines.join('')}\n`); } createStacklessError(message: string): Error { diff --git a/packages/playwright-core/src/server/selectors.ts b/packages/playwright-core/src/server/selectors.ts index e6989c88dd..d94170af89 100644 --- a/packages/playwright-core/src/server/selectors.ts +++ b/packages/playwright-core/src/server/selectors.ts @@ -24,7 +24,6 @@ import { createGuid } from '../utils/utils'; export type SelectorInfo = { parsed: ParsedSelector, world: types.World, - selector: string, strict: boolean, }; @@ -141,7 +140,6 @@ export class Selectors { } return { parsed, - selector, world: needsMainWorld ? 'main' : 'utility', strict, };