playwright/src/server/supplements/recorder/recorderActions.ts

150 lines
3.4 KiB
TypeScript
Raw Normal View History

/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export type ActionName =
'check' |
'click' |
'closePage' |
'fill' |
'navigate' |
'openPage' |
'press' |
'select' |
'uncheck' |
'setInputFiles';
export type ActionBase = {
name: ActionName,
signals: Signal[],
}
export type ClickAction = ActionBase & {
name: 'click',
selector: string,
button: 'left' | 'middle' | 'right',
modifiers: number,
clickCount: number,
};
export type CheckAction = ActionBase & {
name: 'check',
selector: string,
};
export type UncheckAction = ActionBase & {
name: 'uncheck',
selector: string,
};
export type FillAction = ActionBase & {
name: 'fill',
selector: string,
text: string,
};
export type NavigateAction = ActionBase & {
name: 'navigate',
url: string,
};
export type OpenPageAction = ActionBase & {
name: 'openPage',
url: string,
};
export type ClosesPageAction = ActionBase & {
name: 'closePage',
};
export type PressAction = ActionBase & {
name: 'press',
selector: string,
key: string,
modifiers: number,
};
export type SelectAction = ActionBase & {
name: 'select',
selector: string,
options: string[],
};
export type SetInputFilesAction = ActionBase & {
name: 'setInputFiles',
selector: string,
files: string[],
};
export type Action = ClickAction | CheckAction | ClosesPageAction | OpenPageAction | UncheckAction | FillAction | NavigateAction | PressAction | SelectAction | SetInputFilesAction;
// Signals.
export type NavigationSignal = {
name: 'navigation',
url: string,
};
export type PopupSignal = {
name: 'popup',
popupAlias: string,
};
export type DownloadSignal = {
name: 'download',
};
export type DialogSignal = {
name: 'dialog',
dialogAlias: string,
};
export type Signal = NavigationSignal | PopupSignal | DownloadSignal | DialogSignal;
export function actionTitle(action: Action): string {
switch (action.name) {
case 'openPage':
return `Open new page`;
case 'closePage':
return `Close page`;
case 'check':
return `Check ${action.selector}`;
case 'uncheck':
return `Uncheck ${action.selector}`;
case 'click': {
if (action.clickCount === 1)
return `Click ${action.selector}`;
if (action.clickCount === 2)
return `Double click ${action.selector}`;
if (action.clickCount === 3)
return `Triple click ${action.selector}`;
return `${action.clickCount}× click`;
}
case 'fill':
return `Fill ${action.selector}`;
case 'setInputFiles':
if (action.files.length === 0)
return `Clear selected files`;
else
return `Upload ${action.files.join(', ')}`;
case 'navigate':
return `Go to ${action.url}`;
case 'press':
return `Press ${action.key}` + (action.modifiers ? ' with modifiers' : '');
case 'select':
return `Select ${action.options.join(', ')}`;
}
}