Skip to content

Commit 3477c89

Browse files
authored
fix(trace-viewer): survive broken selectors (microsoft#21866)
Fixes microsoft#21832
1 parent d10fac4 commit 3477c89

File tree

4 files changed

+16
-3
lines changed

4 files changed

+16
-3
lines changed

packages/trace-viewer/src/ui/actionList.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ const renderAction = (
6060
revealConsole: () => void
6161
) => {
6262
const { errors, warnings } = modelUtil.stats(action);
63-
const locator = action.params.selector ? asLocator(sdkLanguage || 'javascript', action.params.selector) : undefined;
63+
const locator = action.params.selector ? asLocator(sdkLanguage || 'javascript', action.params.selector, false /* isFrameLocator */, true /* playSafe */) : undefined;
6464

6565
let time: string = '';
6666
if (action.endTime)

packages/trace-viewer/src/ui/callTab.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ function propertyToString(event: ActionTraceEvent, name: string, value: any, sdk
9595
if ((name === 'value' && isEval) || (name === 'received' && event.method === 'expect'))
9696
value = parseSerializedValue(value, new Array(10).fill({ handle: '<handle>' }));
9797
if (name === 'selector')
98-
return { text: asLocator(sdkLanguage || 'javascript', event.params.selector), type: 'locator', name: 'locator' };
98+
return { text: asLocator(sdkLanguage || 'javascript', event.params.selector, false /* isFrameLocator */, true /* playSafe */), type: 'locator', name: 'locator' };
9999
const type = typeof value;
100100
if (type !== 'object' || value === null)
101101
return { text: String(value), type, name };

packages/trace-viewer/src/ui/snapshotTab.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ export const InspectModeController: React.FunctionComponent<{
265265
recorder = new Recorder(injectedScript, {
266266
async setSelector(selector: string) {
267267
recorder!.setUIState({ mode: 'none', language: sdkLanguage, testIdAttributeName });
268-
setHighlightedLocator(asLocator('javascript', selector, false));
268+
setHighlightedLocator(asLocator('javascript', selector, false /* isFrameLocator */, true /* playSafe */));
269269
}
270270
});
271271
win._recorder = recorder;

tests/library/trace-viewer.spec.ts

+13
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,19 @@ test('should include requestUrl in route.fulfill', async ({ page, runAndTrace, b
689689
await expect(callLine.getByText('requestUrl')).toContainText('http://test.com');
690690
});
691691

692+
test('should not crash with broken locator', async ({ page, runAndTrace, server }) => {
693+
test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/21832' });
694+
const traceViewer = await runAndTrace(async () => {
695+
try {
696+
await page.locator('[class*=github-btn] a]').click();
697+
} catch (e) {
698+
}
699+
});
700+
await expect(traceViewer.page).toHaveTitle('Playwright Trace Viewer');
701+
const header = traceViewer.page.getByText('Playwright', { exact: true });
702+
await expect(header).toBeVisible();
703+
});
704+
692705
test('should include requestUrl in route.continue', async ({ page, runAndTrace, server }) => {
693706
await page.route('**/*', route => {
694707
route.continue({ url: server.EMPTY_PAGE });

0 commit comments

Comments
 (0)