mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	chore: hide selector factories (#17844)
This commit is contained in:
		
							parent
							
								
									0b1b718afc
								
							
						
					
					
						commit
						ff15fcf911
					
				| @ -18,7 +18,7 @@ | ||||
| import { assert } from '../utils'; | ||||
| import type * as channels from '@protocol/channels'; | ||||
| import { ChannelOwner } from './channelOwner'; | ||||
| import { FrameLocator, Locator } from './locator'; | ||||
| import { FrameLocator, getByAltTextSelector, getByLabelSelector, getByPlaceholderSelector, getByRoleSelector, getByTestIdSelector, getByTextSelector, getByTitleSelector, Locator } from './locator'; | ||||
| import type { ByRoleOptions, LocatorOptions } from './locator'; | ||||
| import { ElementHandle, convertSelectOptionValues, convertInputFiles } from './elementHandle'; | ||||
| import { assertMaxArguments, JSHandle, serializeArgument, parseResult } from './jsHandle'; | ||||
| @ -300,31 +300,31 @@ export class Frame extends ChannelOwner<channels.FrameChannel> implements api.Fr | ||||
|   } | ||||
| 
 | ||||
|   getByTestId(testId: string): Locator { | ||||
|     return this.locator(Locator.getByTestIdSelector(testId)); | ||||
|     return this.locator(getByTestIdSelector(testId)); | ||||
|   } | ||||
| 
 | ||||
|   getByAltText(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByAltTextSelector(text, options)); | ||||
|     return this.locator(getByAltTextSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByLabel(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByLabelSelector(text, options)); | ||||
|     return this.locator(getByLabelSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByPlaceholder(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByPlaceholderSelector(text, options)); | ||||
|     return this.locator(getByPlaceholderSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByText(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByTextSelector(text, options)); | ||||
|     return this.locator(getByTextSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByTitle(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByTitleSelector(text, options)); | ||||
|     return this.locator(getByTitleSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByRole(role: string, options: ByRoleOptions = {}): Locator { | ||||
|     return this.locator(Locator.getByRoleSelector(role, options)); | ||||
|     return this.locator(getByRoleSelector(role, options)); | ||||
|   } | ||||
| 
 | ||||
|   frameLocator(selector: string): FrameLocator { | ||||
|  | ||||
| @ -46,62 +46,6 @@ export class Locator implements api.Locator { | ||||
|   _frame: Frame; | ||||
|   _selector: string; | ||||
| 
 | ||||
|   static _testIdAttributeName = 'data-testid'; | ||||
|   static _setTestIdAttribute(attributeName: string) { | ||||
|     Locator._testIdAttributeName = attributeName; | ||||
|   } | ||||
| 
 | ||||
|   static getByTestIdSelector(testId: string): string { | ||||
|     return Locator.getByAttributeTextSelector(this._testIdAttributeName, testId, { exact: true }); | ||||
|   } | ||||
| 
 | ||||
|   private static getByAttributeTextSelector(attrName: string, text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|     if (!isString(text)) | ||||
|       return `internal:attr=[${attrName}=${text}]`; | ||||
|     return `internal:attr=[${attrName}=${escapeForAttributeSelector(text)}${options?.exact ? 's' : 'i'}]`; | ||||
|   } | ||||
| 
 | ||||
|   static getByLabelSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|     return 'internal:label=' + escapeForTextSelector(text, !!options?.exact); | ||||
|   } | ||||
| 
 | ||||
|   static getByAltTextSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|     return Locator.getByAttributeTextSelector('alt', text, options); | ||||
|   } | ||||
| 
 | ||||
|   static getByTitleSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|     return Locator.getByAttributeTextSelector('title', text, options); | ||||
|   } | ||||
| 
 | ||||
|   static getByPlaceholderSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|     return Locator.getByAttributeTextSelector('placeholder', text, options); | ||||
|   } | ||||
| 
 | ||||
|   static getByTextSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|     return 'text=' + escapeForTextSelector(text, !!options?.exact); | ||||
|   } | ||||
| 
 | ||||
|   static getByRoleSelector(role: string, options: ByRoleOptions = {}): string { | ||||
|     const props: string[][] = []; | ||||
|     if (options.checked !== undefined) | ||||
|       props.push(['checked', String(options.checked)]); | ||||
|     if (options.disabled !== undefined) | ||||
|       props.push(['disabled', String(options.disabled)]); | ||||
|     if (options.selected !== undefined) | ||||
|       props.push(['selected', String(options.selected)]); | ||||
|     if (options.expanded !== undefined) | ||||
|       props.push(['expanded', String(options.expanded)]); | ||||
|     if (options.includeHidden !== undefined) | ||||
|       props.push(['include-hidden', String(options.includeHidden)]); | ||||
|     if (options.level !== undefined) | ||||
|       props.push(['level', String(options.level)]); | ||||
|     if (options.name !== undefined) | ||||
|       props.push(['name', isString(options.name) ? escapeForAttributeSelector(options.name) : String(options.name)]); | ||||
|     if (options.pressed !== undefined) | ||||
|       props.push(['pressed', String(options.pressed)]); | ||||
|     return `role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join('')}`; | ||||
|   } | ||||
| 
 | ||||
|   constructor(frame: Frame, selector: string, options?: LocatorOptions) { | ||||
|     this._frame = frame; | ||||
|     this._selector = selector; | ||||
| @ -197,31 +141,31 @@ export class Locator implements api.Locator { | ||||
|   } | ||||
| 
 | ||||
|   getByTestId(testId: string): Locator { | ||||
|     return this.locator(Locator.getByTestIdSelector(testId)); | ||||
|     return this.locator(getByTestIdSelector(testId)); | ||||
|   } | ||||
| 
 | ||||
|   getByAltText(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByAltTextSelector(text, options)); | ||||
|     return this.locator(getByAltTextSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByLabel(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByLabelSelector(text, options)); | ||||
|     return this.locator(getByLabelSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByPlaceholder(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByPlaceholderSelector(text, options)); | ||||
|     return this.locator(getByPlaceholderSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByText(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByTextSelector(text, options)); | ||||
|     return this.locator(getByTextSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByTitle(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByTitleSelector(text, options)); | ||||
|     return this.locator(getByTitleSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByRole(role: string, options: ByRoleOptions = {}): Locator { | ||||
|     return this.locator(Locator.getByRoleSelector(role, options)); | ||||
|     return this.locator(getByRoleSelector(role, options)); | ||||
|   } | ||||
| 
 | ||||
|   frameLocator(selector: string): FrameLocator { | ||||
| @ -399,31 +343,31 @@ export class FrameLocator implements api.FrameLocator { | ||||
|   } | ||||
| 
 | ||||
|   getByTestId(testId: string): Locator { | ||||
|     return this.locator(Locator.getByTestIdSelector(testId)); | ||||
|     return this.locator(getByTestIdSelector(testId)); | ||||
|   } | ||||
| 
 | ||||
|   getByAltText(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByAltTextSelector(text, options)); | ||||
|     return this.locator(getByAltTextSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByLabel(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByLabelSelector(text, options)); | ||||
|     return this.locator(getByLabelSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByPlaceholder(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByPlaceholderSelector(text, options)); | ||||
|     return this.locator(getByPlaceholderSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByText(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByTextSelector(text, options)); | ||||
|     return this.locator(getByTextSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByTitle(text: string | RegExp, options?: { exact?: boolean }): Locator { | ||||
|     return this.locator(Locator.getByTitleSelector(text, options)); | ||||
|     return this.locator(getByTitleSelector(text, options)); | ||||
|   } | ||||
| 
 | ||||
|   getByRole(role: string, options: ByRoleOptions = {}): Locator { | ||||
|     return this.locator(Locator.getByRoleSelector(role, options)); | ||||
|     return this.locator(getByRoleSelector(role, options)); | ||||
|   } | ||||
| 
 | ||||
|   frameLocator(selector: string): FrameLocator { | ||||
| @ -442,3 +386,61 @@ export class FrameLocator implements api.FrameLocator { | ||||
|     return new FrameLocator(this._frame, this._frameSelector + ` >> nth=${index}`); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| let testIdAttributeName: string = 'data-testid'; | ||||
| 
 | ||||
| export function setTestIdAttribute(attributeName: string) { | ||||
|   testIdAttributeName = attributeName; | ||||
| } | ||||
| 
 | ||||
| function getByAttributeTextSelector(attrName: string, text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|   if (!isString(text)) | ||||
|     return `internal:attr=[${attrName}=${text}]`; | ||||
|   return `internal:attr=[${attrName}=${escapeForAttributeSelector(text)}${options?.exact ? 's' : 'i'}]`; | ||||
| } | ||||
| 
 | ||||
| export function getByTestIdSelector(testId: string): string { | ||||
|   return getByAttributeTextSelector(testIdAttributeName, testId, { exact: true }); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| export function getByLabelSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|   return 'internal:label=' + escapeForTextSelector(text, !!options?.exact); | ||||
| } | ||||
| 
 | ||||
| export function getByAltTextSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|   return getByAttributeTextSelector('alt', text, options); | ||||
| } | ||||
| 
 | ||||
| export function getByTitleSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|   return getByAttributeTextSelector('title', text, options); | ||||
| } | ||||
| 
 | ||||
| export function getByPlaceholderSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|   return getByAttributeTextSelector('placeholder', text, options); | ||||
| } | ||||
| 
 | ||||
| export function getByTextSelector(text: string | RegExp, options?: { exact?: boolean }): string { | ||||
|   return 'text=' + escapeForTextSelector(text, !!options?.exact); | ||||
| } | ||||
| 
 | ||||
| export function getByRoleSelector(role: string, options: ByRoleOptions = {}): string { | ||||
|   const props: string[][] = []; | ||||
|   if (options.checked !== undefined) | ||||
|     props.push(['checked', String(options.checked)]); | ||||
|   if (options.disabled !== undefined) | ||||
|     props.push(['disabled', String(options.disabled)]); | ||||
|   if (options.selected !== undefined) | ||||
|     props.push(['selected', String(options.selected)]); | ||||
|   if (options.expanded !== undefined) | ||||
|     props.push(['expanded', String(options.expanded)]); | ||||
|   if (options.includeHidden !== undefined) | ||||
|     props.push(['include-hidden', String(options.includeHidden)]); | ||||
|   if (options.level !== undefined) | ||||
|     props.push(['level', String(options.level)]); | ||||
|   if (options.name !== undefined) | ||||
|     props.push(['name', isString(options.name) ? escapeForAttributeSelector(options.name) : String(options.name)]); | ||||
|   if (options.pressed !== undefined) | ||||
|     props.push(['pressed', String(options.pressed)]); | ||||
|   return `role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join('')}`; | ||||
| } | ||||
|  | ||||
| @ -19,7 +19,7 @@ import type * as channels from '@protocol/channels'; | ||||
| import { ChannelOwner } from './channelOwner'; | ||||
| import type { SelectorEngine } from './types'; | ||||
| import type * as api from '../../types/types'; | ||||
| import { Locator } from './locator'; | ||||
| import { setTestIdAttribute } from './locator'; | ||||
| 
 | ||||
| export class Selectors implements api.Selectors { | ||||
|   private _channels = new Set<SelectorsOwner>(); | ||||
| @ -34,7 +34,7 @@ export class Selectors implements api.Selectors { | ||||
|   } | ||||
| 
 | ||||
|   setTestIdAttribute(attributeName: string) { | ||||
|     Locator._setTestIdAttribute(attributeName); | ||||
|     setTestIdAttribute(attributeName); | ||||
|   } | ||||
| 
 | ||||
|   _addChannel(channel: SelectorsOwner) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Pavel Feldman
						Pavel Feldman