chore: report highlight parse error to debug controller (#33984)

This commit is contained in:
Pavel Feldman 2024-12-13 16:10:59 -08:00 committed by GitHub
parent cbc809edc7
commit 3a10c32d8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 10 deletions

View File

@ -25,6 +25,9 @@ import { Recorder } from './recorder';
import { EmptyRecorderApp } from './recorder/recorderApp'; import { EmptyRecorderApp } from './recorder/recorderApp';
import { asLocator, type Language } from '../utils'; import { asLocator, type Language } from '../utils';
import { parseYamlForAriaSnapshot } from './ariaSnapshot'; import { parseYamlForAriaSnapshot } from './ariaSnapshot';
import type { ParsedYaml } from '../utils/isomorphic/ariaSnapshot';
import { parseYamlTemplate } from '../utils/isomorphic/ariaSnapshot';
import { unsafeLocatorOrSelectorAsSelector } from '../utils/isomorphic/locatorParser';
const internalMetadata = serverSideCallMetadata(); const internalMetadata = serverSideCallMetadata();
@ -144,9 +147,17 @@ export class DebugController extends SdkObject {
} }
async highlight(params: { selector?: string, ariaTemplate?: string }) { async highlight(params: { selector?: string, ariaTemplate?: string }) {
// Assert parameters validity.
if (params.selector)
unsafeLocatorOrSelectorAsSelector(this._sdkLanguage, params.selector, 'data-testid');
let parsedYaml: ParsedYaml | undefined;
if (params.ariaTemplate) {
parsedYaml = parseYamlForAriaSnapshot(params.ariaTemplate);
parseYamlTemplate(parsedYaml);
}
for (const recorder of await this._allRecorders()) { for (const recorder of await this._allRecorders()) {
if (params.ariaTemplate) if (parsedYaml)
recorder.setHighlightedAriaTemplate(parseYamlForAriaSnapshot(params.ariaTemplate)); recorder.setHighlightedAriaTemplate(parsedYaml);
else if (params.selector) else if (params.selector)
recorder.setHighlightedSelector(this._sdkLanguage, params.selector); recorder.setHighlightedSelector(this._sdkLanguage, params.selector);
} }

View File

@ -216,19 +216,24 @@ function transform(template: string, params: TemplateParams, testIdAttributeName
} }
export function locatorOrSelectorAsSelector(language: Language, locator: string, testIdAttributeName: string): string { export function locatorOrSelectorAsSelector(language: Language, locator: string, testIdAttributeName: string): string {
try {
return unsafeLocatorOrSelectorAsSelector(language, locator, testIdAttributeName);
} catch (e) {
return '';
}
}
export function unsafeLocatorOrSelectorAsSelector(language: Language, locator: string, testIdAttributeName: string): string {
try { try {
parseSelector(locator); parseSelector(locator);
return locator; return locator;
} catch (e) { } catch (e) {
} }
try { const { selector, preferredQuote } = parseLocator(locator, testIdAttributeName);
const { selector, preferredQuote } = parseLocator(locator, testIdAttributeName); const locators = asLocators(language, selector, undefined, undefined, preferredQuote);
const locators = asLocators(language, selector, undefined, undefined, preferredQuote); const digest = digestForComparison(language, locator);
const digest = digestForComparison(language, locator); if (locators.some(candidate => digestForComparison(language, candidate) === digest))
if (locators.some(candidate => digestForComparison(language, candidate) === digest)) return selector;
return selector;
} catch (e) {
}
return ''; return '';
} }

View File

@ -300,3 +300,9 @@ test('should highlight aria template', async ({ backend, connectedBrowser }, tes
const box2 = roundBox(await highlight.boundingBox()); const box2 = roundBox(await highlight.boundingBox());
expect(box1).toEqual(box2); expect(box1).toEqual(box2);
}); });
test('should report error in aria template', async ({ backend }) => {
await backend.navigate({ url: `data:text/html,<button>Submit</button>` });
const error = await backend.highlight({ ariaTemplate: `- button "Submit` }).catch(e => e);
expect(error.message).toContain('Unterminated string:');
});