From 85467d1b7dbe763a2cdb4b4b0fa0830a07313356 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Mon, 28 Nov 2022 19:55:34 -0800 Subject: [PATCH] chore: generate get by title (#19119) --- .../src/server/injected/selectorGenerator.ts | 4 ++++ tests/library/selector-generator.spec.ts | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/playwright-core/src/server/injected/selectorGenerator.ts b/packages/playwright-core/src/server/injected/selectorGenerator.ts index 61e985f003..3cf5e7e51f 100644 --- a/packages/playwright-core/src/server/injected/selectorGenerator.ts +++ b/packages/playwright-core/src/server/injected/selectorGenerator.ts @@ -35,6 +35,7 @@ const kLabelScore = 3; const kRoleWithNameScore = 5; const kAltTextScore = 10; const kTextScore = 15; +const kTitleScore = 20; const kCSSIdScore = 100; const kRoleWithoutNameScore = 140; const kCSSInputTypeNameScore = 150; @@ -193,6 +194,9 @@ function buildCandidates(injectedScript: InjectedScript, element: Element, testI if (element.getAttribute('name') && ['BUTTON', 'FORM', 'FIELDSET', 'FRAME', 'IFRAME', 'INPUT', 'KEYGEN', 'OBJECT', 'OUTPUT', 'SELECT', 'TEXTAREA', 'MAP', 'META', 'PARAM'].includes(element.nodeName)) candidates.push({ engine: 'css', selector: `${cssEscape(element.nodeName.toLowerCase())}[name=${quoteAttributeValue(element.getAttribute('name')!)}]`, score: kCSSInputTypeNameScore }); + if (element.getAttribute('title')) + candidates.push({ engine: 'internal:attr', selector: `[title=${escapeForAttributeSelector(element.getAttribute('title')!, false)}]`, score: kTitleScore }); + if (['INPUT', 'TEXTAREA'].includes(element.nodeName) && element.getAttribute('type') !== 'hidden') { if (element.getAttribute('type')) candidates.push({ engine: 'css', selector: `${cssEscape(element.nodeName.toLowerCase())}[type=${quoteAttributeValue(element.getAttribute('type')!)}]`, score: kCSSInputTypeNameScore }); diff --git a/tests/library/selector-generator.spec.ts b/tests/library/selector-generator.spec.ts index 856ec64bbd..8a99184d91 100644 --- a/tests/library/selector-generator.spec.ts +++ b/tests/library/selector-generator.spec.ts @@ -406,4 +406,12 @@ it.describe('selector generator', () => { await page.setContent(`
`); expect(await generate(page, '[data-testid=wrapper] > input')).toBe('internal:testid=[data-testid="wrapper"s] >> internal:role=checkbox'); }); + + it('should generate title selector', async ({ page }) => { + await page.setContent(`
+ + +
`); + expect(await generate(page, 'button')).toBe('internal:attr=[title=\"Send to\"i]'); + }); });