Better handling for non-JS Playwright actions

This commit is contained in:
Adam Gastineau 2025-01-13 08:02:17 -08:00
parent 9cb8d55bea
commit fa033bb9e6
2 changed files with 60 additions and 22 deletions

View file

@ -117,12 +117,12 @@ const ActionParameterContext: React.FC<{
<div <div
className={clsx( className={clsx(
'action-parameter', 'action-parameter',
action.apiName.startsWith('locator') parameterString.type === 'locator'
? 'action-locator-parameter' ? 'action-locator-parameter'
: 'action-generic-parameter', : 'action-generic-parameter',
)} )}
> >
{parameterString} {parameterString.value}
</div> </div>
); );
}; };

View file

@ -17,21 +17,28 @@
import type { ActionTraceEvent } from '@trace/trace'; import type { ActionTraceEvent } from '@trace/trace';
import { asLocator, type Language } from '@isomorphic/locatorGenerators'; import { asLocator, type Language } from '@isomorphic/locatorGenerators';
export interface ActionParameterDisplayString {
type: 'generic' | 'locator';
value: string;
}
const formatClockParams = (params: { const formatClockParams = (params: {
ticksNumber?: number; ticksNumber?: number;
ticksString?: string; ticksString?: string;
timeNumber?: number; timeNumber?: number;
}): string | undefined => { }): ActionParameterDisplayString | undefined => {
let value: string | undefined = undefined;
if (params.ticksNumber !== undefined) { if (params.ticksNumber !== undefined) {
// clock.fastForward/runFor // clock.fastForward/runFor
return `${params.ticksNumber}ms`; value = `${params.ticksNumber}ms`;
} else if (params.ticksString !== undefined) { } else if (params.ticksString !== undefined) {
// clock.fastForward/runFor // clock.fastForward/runFor
return params.ticksString; value = params.ticksString;
} else if (params.timeNumber !== undefined) { } else if (params.timeNumber !== undefined) {
// clock.pauseAt/setFixedTime/setSystemTime // clock.pauseAt/setFixedTime/setSystemTime
try { try {
return new Date(params.timeNumber).toLocaleString(undefined, { value = new Date(params.timeNumber).toLocaleString(undefined, {
timeZone: 'UTC', timeZone: 'UTC',
}); });
} catch (e) { } catch (e) {
@ -39,30 +46,44 @@ const formatClockParams = (params: {
} }
} }
if (value === undefined)
return undefined; return undefined;
return {
type: 'generic',
value,
};
}; };
const formatLocatorParams = ( const formatLocatorParams = (
sdkLanguage: Language, sdkLanguage: Language,
params: { selector?: string }, params: { selector?: string },
): string | undefined => ): ActionParameterDisplayString | undefined =>
params.selector !== undefined params.selector !== undefined
? asLocator(sdkLanguage, params.selector) ? { type: 'locator', value: asLocator(sdkLanguage, params.selector) }
: undefined; : undefined;
const formatKeyboardParams = (params: { const formatKeyboardParams = (params: {
key?: string; key?: string;
text?: string; text?: string;
}): string | undefined => { }): ActionParameterDisplayString | undefined => {
let value: string | undefined = undefined;
if (params.key !== undefined) { if (params.key !== undefined) {
// keyboard.press/down/up // keyboard.press/down/up
return params.key; value = params.key;
} else if (params.text !== undefined) { } else if (params.text !== undefined) {
// keyboard.type/insertText // keyboard.type/insertText
return `"${params.text}"`; value = `"${params.text}"`;
} }
if (value === undefined)
return undefined; return undefined;
return {
type: 'generic',
value,
};
}; };
const formatMouseParams = (params: { const formatMouseParams = (params: {
@ -70,36 +91,52 @@ const formatMouseParams = (params: {
y?: number; y?: number;
deltaX?: number; deltaX?: number;
deltaY?: number; deltaY?: number;
}): string | undefined => { }): ActionParameterDisplayString | undefined => {
let value: string | undefined = undefined;
if (params.x !== undefined && params.y !== undefined) { if (params.x !== undefined && params.y !== undefined) {
// mouse.click/dblclick/move // mouse.click/dblclick/move
return `(${params.x}, ${params.y})`; value = `(${params.x}, ${params.y})`;
} else if (params.deltaX !== undefined && params.deltaY !== undefined) { } else if (params.deltaX !== undefined && params.deltaY !== undefined) {
// mouse.wheel // mouse.wheel
return `(${params.deltaX}, ${params.deltaY})`; value = `(${params.deltaX}, ${params.deltaY})`;
} }
if (value === undefined)
return undefined; return undefined;
return {
type: 'generic',
value,
};
}; };
const formatTouchscreenParams = (params: { const formatTouchscreenParams = (params: {
x?: number; x?: number;
y?: number; y?: number;
}): string | undefined => { }): ActionParameterDisplayString | undefined => {
let value: string | undefined = undefined;
if (params.x && params.y) { if (params.x && params.y) {
// touchscreen.tap // touchscreen.tap
return `(${params.x}, ${params.y})`; value = `(${params.x}, ${params.y})`;
} }
if (value === undefined)
return undefined; return undefined;
return {
type: 'generic',
value,
};
}; };
export const actionParameterDisplayString = ( export const actionParameterDisplayString = (
action: ActionTraceEvent, action: ActionTraceEvent,
sdkLanguage: Language, sdkLanguage: Language,
): string | undefined => { ): ActionParameterDisplayString | undefined => {
const params = action.params; const params = action.params;
const apiName = action.apiName; const apiName = action.apiName.toLowerCase();
switch (true) { switch (true) {
case apiName.startsWith('clock'): case apiName.startsWith('clock'):
@ -108,6 +145,7 @@ export const actionParameterDisplayString = (
return formatKeyboardParams(params); return formatKeyboardParams(params);
case apiName.startsWith('locator'): case apiName.startsWith('locator'):
case apiName.startsWith('expect'): case apiName.startsWith('expect'):
case apiName.startsWith('frame'):
return formatLocatorParams(sdkLanguage, params); return formatLocatorParams(sdkLanguage, params);
case apiName.startsWith('mouse'): case apiName.startsWith('mouse'):
return formatMouseParams(params); return formatMouseParams(params);