fix(tracing): explicitly list actions to snapshot (#7376)

This commit is contained in:
Pavel Feldman 2021-06-29 15:28:15 -07:00 committed by GitHub
parent 3ce1f5c33e
commit b1d66d54f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 223 additions and 10 deletions

View file

@ -3235,3 +3235,73 @@ export type SocksSocketConnectedResult = void;
export type SocksSocketEndParams = {}; export type SocksSocketEndParams = {};
export type SocksSocketEndOptions = {}; export type SocksSocketEndOptions = {};
export type SocksSocketEndResult = void; export type SocksSocketEndResult = void;
export const commandsWithTracingSnapshots = new Set([
'Page.goBack',
'Page.goForward',
'Page.reload',
'Page.setViewportSize',
'Page.keyboardDown',
'Page.keyboardUp',
'Page.keyboardInsertText',
'Page.keyboardType',
'Page.keyboardPress',
'Page.mouseMove',
'Page.mouseDown',
'Page.mouseUp',
'Page.mouseClick',
'Page.touchscreenTap',
'Frame.evalOnSelector',
'Frame.evalOnSelectorAll',
'Frame.addScriptTag',
'Frame.addStyleTag',
'Frame.check',
'Frame.click',
'Frame.dblclick',
'Frame.dispatchEvent',
'Frame.evaluateExpression',
'Frame.evaluateExpressionHandle',
'Frame.fill',
'Frame.focus',
'Frame.getAttribute',
'Frame.goto',
'Frame.hover',
'Frame.innerHTML',
'Frame.innerText',
'Frame.inputValue',
'Frame.isChecked',
'Frame.isDisabled',
'Frame.isEnabled',
'Frame.isHidden',
'Frame.isEditable',
'Frame.press',
'Frame.selectOption',
'Frame.setContent',
'Frame.setInputFiles',
'Frame.tap',
'Frame.textContent',
'Frame.type',
'Frame.uncheck',
'Frame.waitForFunction',
'Frame.waitForSelector',
'JSHandle.evaluateExpression',
'JSHandle.evaluateExpressionHandle',
'ElementHandle.evalOnSelector',
'ElementHandle.evalOnSelectorAll',
'ElementHandle.check',
'ElementHandle.click',
'ElementHandle.dblclick',
'ElementHandle.dispatchEvent',
'ElementHandle.fill',
'ElementHandle.hover',
'ElementHandle.press',
'ElementHandle.scrollIntoViewIfNeeded',
'ElementHandle.selectOption',
'ElementHandle.selectText',
'ElementHandle.setInputFiles',
'ElementHandle.tap',
'ElementHandle.type',
'ElementHandle.uncheck',
'ElementHandle.waitForElementState',
'ElementHandle.waitForSelector'
]);

View file

@ -764,6 +764,8 @@ Page:
- networkidle - networkidle
returns: returns:
response: Response? response: Response?
tracing:
snapshot: true
goForward: goForward:
parameters: parameters:
@ -776,6 +778,8 @@ Page:
- networkidle - networkidle
returns: returns:
response: Response? response: Response?
tracing:
snapshot: true
reload: reload:
parameters: parameters:
@ -788,6 +792,8 @@ Page:
- networkidle - networkidle
returns: returns:
response: Response? response: Response?
tracing:
snapshot: true
screenshot: screenshot:
parameters: parameters:
@ -821,34 +827,48 @@ Page:
properties: properties:
width: number width: number
height: number height: number
tracing:
snapshot: true
keyboardDown: keyboardDown:
parameters: parameters:
key: string key: string
tracing:
snapshot: true
keyboardUp: keyboardUp:
parameters: parameters:
key: string key: string
tracing:
snapshot: true
keyboardInsertText: keyboardInsertText:
parameters: parameters:
text: string text: string
tracing:
snapshot: true
keyboardType: keyboardType:
parameters: parameters:
text: string text: string
delay: number? delay: number?
tracing:
snapshot: true
keyboardPress: keyboardPress:
parameters: parameters:
key: string key: string
delay: number? delay: number?
tracing:
snapshot: true
mouseMove: mouseMove:
parameters: parameters:
x: number x: number
y: number y: number
steps: number? steps: number?
tracing:
snapshot: true
mouseDown: mouseDown:
parameters: parameters:
@ -859,6 +879,8 @@ Page:
- right - right
- middle - middle
clickCount: number? clickCount: number?
tracing:
snapshot: true
mouseUp: mouseUp:
parameters: parameters:
@ -869,6 +891,8 @@ Page:
- right - right
- middle - middle
clickCount: number? clickCount: number?
tracing:
snapshot: true
mouseClick: mouseClick:
parameters: parameters:
@ -882,11 +906,15 @@ Page:
- right - right
- middle - middle
clickCount: number? clickCount: number?
tracing:
snapshot: true
touchscreenTap: touchscreenTap:
parameters: parameters:
x: number x: number
y: number y: number
tracing:
snapshot: true
accessibilitySnapshot: accessibilitySnapshot:
parameters: parameters:
@ -1062,6 +1090,8 @@ Frame:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
value: SerializedValue value: SerializedValue
tracing:
snapshot: true
evalOnSelectorAll: evalOnSelectorAll:
parameters: parameters:
@ -1071,6 +1101,8 @@ Frame:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
value: SerializedValue value: SerializedValue
tracing:
snapshot: true
addScriptTag: addScriptTag:
parameters: parameters:
@ -1079,6 +1111,8 @@ Frame:
type: string? type: string?
returns: returns:
element: ElementHandle element: ElementHandle
tracing:
snapshot: true
addStyleTag: addStyleTag:
parameters: parameters:
@ -1086,6 +1120,8 @@ Frame:
content: string? content: string?
returns: returns:
element: ElementHandle element: ElementHandle
tracing:
snapshot: true
check: check:
parameters: parameters:
@ -1095,6 +1131,8 @@ Frame:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
click: click:
parameters: parameters:
@ -1121,6 +1159,8 @@ Frame:
clickCount: number? clickCount: number?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
content: content:
returns: returns:
@ -1150,6 +1190,8 @@ Frame:
- middle - middle
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
dispatchEvent: dispatchEvent:
parameters: parameters:
@ -1157,6 +1199,8 @@ Frame:
type: string type: string
eventInit: SerializedArgument eventInit: SerializedArgument
timeout: number? timeout: number?
tracing:
snapshot: true
evaluateExpression: evaluateExpression:
parameters: parameters:
@ -1165,6 +1209,8 @@ Frame:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
value: SerializedValue value: SerializedValue
tracing:
snapshot: true
evaluateExpressionHandle: evaluateExpressionHandle:
parameters: parameters:
@ -1173,6 +1219,8 @@ Frame:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
handle: JSHandle handle: JSHandle
tracing:
snapshot: true
fill: fill:
parameters: parameters:
@ -1181,11 +1229,15 @@ Frame:
force: boolean? force: boolean?
timeout: number? timeout: number?
noWaitAfter: boolean? noWaitAfter: boolean?
tracing:
snapshot: true
focus: focus:
parameters: parameters:
selector: string selector: string
timeout: number? timeout: number?
tracing:
snapshot: true
frameElement: frameElement:
returns: returns:
@ -1198,6 +1250,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: string? value: string?
tracing:
snapshot: true
goto: goto:
parameters: parameters:
@ -1212,6 +1266,8 @@ Frame:
referer: string? referer: string?
returns: returns:
response: Response? response: Response?
tracing:
snapshot: true
hover: hover:
parameters: parameters:
@ -1229,6 +1285,8 @@ Frame:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
innerHTML: innerHTML:
parameters: parameters:
@ -1236,6 +1294,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: string value: string
tracing:
snapshot: true
innerText: innerText:
parameters: parameters:
@ -1243,6 +1303,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: string value: string
tracing:
snapshot: true
inputValue: inputValue:
parameters: parameters:
@ -1250,6 +1312,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: string value: string
tracing:
snapshot: true
isChecked: isChecked:
parameters: parameters:
@ -1257,6 +1321,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: boolean value: boolean
tracing:
snapshot: true
isDisabled: isDisabled:
parameters: parameters:
@ -1264,6 +1330,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: boolean value: boolean
tracing:
snapshot: true
isEnabled: isEnabled:
parameters: parameters:
@ -1271,6 +1339,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: boolean value: boolean
tracing:
snapshot: true
isHidden: isHidden:
parameters: parameters:
@ -1278,6 +1348,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: boolean value: boolean
tracing:
snapshot: true
isVisible: isVisible:
parameters: parameters:
@ -1292,6 +1364,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: boolean value: boolean
tracing:
snapshot: true
press: press:
parameters: parameters:
@ -1300,6 +1374,8 @@ Frame:
delay: number? delay: number?
noWaitAfter: boolean? noWaitAfter: boolean?
timeout: number? timeout: number?
tracing:
snapshot: true
querySelector: querySelector:
parameters: parameters:
@ -1336,6 +1412,8 @@ Frame:
values: values:
type: array type: array
items: string items: string
tracing:
snapshot: true
setContent: setContent:
parameters: parameters:
@ -1347,6 +1425,8 @@ Frame:
- load - load
- domcontentloaded - domcontentloaded
- networkidle - networkidle
tracing:
snapshot: true
setInputFiles: setInputFiles:
parameters: parameters:
@ -1361,6 +1441,8 @@ Frame:
buffer: binary buffer: binary
timeout: number? timeout: number?
noWaitAfter: boolean? noWaitAfter: boolean?
tracing:
snapshot: true
tap: tap:
parameters: parameters:
@ -1379,6 +1461,8 @@ Frame:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
textContent: textContent:
parameters: parameters:
@ -1386,6 +1470,8 @@ Frame:
timeout: number? timeout: number?
returns: returns:
value: string? value: string?
tracing:
snapshot: true
title: title:
returns: returns:
@ -1398,6 +1484,8 @@ Frame:
delay: number? delay: number?
noWaitAfter: boolean? noWaitAfter: boolean?
timeout: number? timeout: number?
tracing:
snapshot: true
uncheck: uncheck:
parameters: parameters:
@ -1407,6 +1495,8 @@ Frame:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
waitForFunction: waitForFunction:
parameters: parameters:
@ -1418,6 +1508,8 @@ Frame:
pollingInterval: number? pollingInterval: number?
returns: returns:
handle: JSHandle handle: JSHandle
tracing:
snapshot: true
waitForSelector: waitForSelector:
parameters: parameters:
@ -1432,6 +1524,8 @@ Frame:
- hidden - hidden
returns: returns:
element: ElementHandle? element: ElementHandle?
tracing:
snapshot: true
events: events:
@ -1508,6 +1602,8 @@ JSHandle:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
value: SerializedValue value: SerializedValue
tracing:
snapshot: true
evaluateExpressionHandle: evaluateExpressionHandle:
parameters: parameters:
@ -1516,6 +1612,8 @@ JSHandle:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
handle: JSHandle handle: JSHandle
tracing:
snapshot: true
getPropertyList: getPropertyList:
returns: returns:
@ -1560,6 +1658,8 @@ ElementHandle:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
value: SerializedValue value: SerializedValue
tracing:
snapshot: true
evalOnSelectorAll: evalOnSelectorAll:
parameters: parameters:
@ -1569,6 +1669,8 @@ ElementHandle:
arg: SerializedArgument arg: SerializedArgument
returns: returns:
value: SerializedValue value: SerializedValue
tracing:
snapshot: true
boundingBox: boundingBox:
returns: returns:
@ -1581,6 +1683,8 @@ ElementHandle:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
click: click:
parameters: parameters:
@ -1606,6 +1710,8 @@ ElementHandle:
clickCount: number? clickCount: number?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
contentFrame: contentFrame:
returns: returns:
@ -1634,11 +1740,15 @@ ElementHandle:
- middle - middle
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
dispatchEvent: dispatchEvent:
parameters: parameters:
type: string type: string
eventInit: SerializedArgument eventInit: SerializedArgument
tracing:
snapshot: true
fill: fill:
parameters: parameters:
@ -1646,6 +1756,8 @@ ElementHandle:
force: boolean? force: boolean?
timeout: number? timeout: number?
noWaitAfter: boolean? noWaitAfter: boolean?
tracing:
snapshot: true
focus: focus:
@ -1670,6 +1782,8 @@ ElementHandle:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
innerHTML: innerHTML:
returns: returns:
@ -1717,6 +1831,8 @@ ElementHandle:
delay: number? delay: number?
timeout: number? timeout: number?
noWaitAfter: boolean? noWaitAfter: boolean?
tracing:
snapshot: true
querySelector: querySelector:
parameters: parameters:
@ -1748,6 +1864,8 @@ ElementHandle:
scrollIntoViewIfNeeded: scrollIntoViewIfNeeded:
parameters: parameters:
timeout: number? timeout: number?
tracing:
snapshot: true
selectOption: selectOption:
parameters: parameters:
@ -1769,11 +1887,15 @@ ElementHandle:
values: values:
type: array type: array
items: string items: string
tracing:
snapshot: true
selectText: selectText:
parameters: parameters:
force: boolean? force: boolean?
timeout: number? timeout: number?
tracing:
snapshot: true
setInputFiles: setInputFiles:
parameters: parameters:
@ -1787,6 +1909,8 @@ ElementHandle:
buffer: binary buffer: binary
timeout: number? timeout: number?
noWaitAfter: boolean? noWaitAfter: boolean?
tracing:
snapshot: true
tap: tap:
parameters: parameters:
@ -1804,6 +1928,8 @@ ElementHandle:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
textContent: textContent:
returns: returns:
@ -1815,6 +1941,8 @@ ElementHandle:
delay: number? delay: number?
noWaitAfter: boolean? noWaitAfter: boolean?
timeout: number? timeout: number?
tracing:
snapshot: true
uncheck: uncheck:
parameters: parameters:
@ -1823,6 +1951,8 @@ ElementHandle:
position: Point? position: Point?
timeout: number? timeout: number?
trial: boolean? trial: boolean?
tracing:
snapshot: true
waitForElementState: waitForElementState:
parameters: parameters:
@ -1836,6 +1966,8 @@ ElementHandle:
- disabled - disabled
- editable - editable
timeout: number? timeout: number?
tracing:
snapshot: true
waitForSelector: waitForSelector:
parameters: parameters:
@ -1850,6 +1982,8 @@ ElementHandle:
- hidden - hidden
returns: returns:
element: ElementHandle? element: ElementHandle?
tracing:
snapshot: true
Request: Request:

View file

@ -35,6 +35,7 @@ export type ScreencastFrameTraceEvent = {
export type ActionTraceEvent = { export type ActionTraceEvent = {
type: 'action' | 'event', type: 'action' | 'event',
hasSnapshot: boolean,
metadata: CallMetadata, metadata: CallMetadata,
}; };

View file

@ -27,7 +27,7 @@ import { CallMetadata, InstrumentationListener, SdkObject } from '../../instrume
import { Page } from '../../page'; import { Page } from '../../page';
import * as trace from '../common/traceEvents'; import * as trace from '../common/traceEvents';
import { TraceSnapshotter } from './traceSnapshotter'; import { TraceSnapshotter } from './traceSnapshotter';
import { Dialog } from '../../dialog'; import { commandsWithTracingSnapshots } from '../../../protocol/channels';
export type TracerOptions = { export type TracerOptions = {
name?: string; name?: string;
@ -133,13 +133,8 @@ export class Tracing implements InstrumentationListener {
return; return;
if (!this._snapshotter.started()) if (!this._snapshotter.started())
return; return;
if (!this._shouldCaptureSnapshot(metadata))
if (sdkObject instanceof Dialog && name === 'before') {
// A call on the dialog is going to dismiss it and resume the evaluation.
// We can't be capturing the snapshot before dismiss action is performed.
return; return;
}
const snapshotName = `${name}@${metadata.id}`; const snapshotName = `${name}@${metadata.id}`;
metadata.snapshots.push({ title: name, snapshotName }); metadata.snapshots.push({ title: name, snapshotName });
await this._snapshotter!.captureSnapshot(sdkObject.attribution.page, snapshotName, element); await this._snapshotter!.captureSnapshot(sdkObject.attribution.page, snapshotName, element);
@ -167,7 +162,7 @@ export class Tracing implements InstrumentationListener {
} }
pendingCall.afterSnapshot = this._captureSnapshot('after', sdkObject, metadata); pendingCall.afterSnapshot = this._captureSnapshot('after', sdkObject, metadata);
await pendingCall.afterSnapshot; await pendingCall.afterSnapshot;
const event: trace.ActionTraceEvent = { type: 'action', metadata }; const event: trace.ActionTraceEvent = { type: 'action', metadata, hasSnapshot: this._shouldCaptureSnapshot(metadata) };
this._appendTraceEvent(event); this._appendTraceEvent(event);
this._pendingCalls.delete(metadata.id); this._pendingCalls.delete(metadata.id);
} }
@ -175,7 +170,7 @@ export class Tracing implements InstrumentationListener {
onEvent(sdkObject: SdkObject, metadata: CallMetadata) { onEvent(sdkObject: SdkObject, metadata: CallMetadata) {
if (!sdkObject.attribution.page) if (!sdkObject.attribution.page)
return; return;
const event: trace.ActionTraceEvent = { type: 'event', metadata }; const event: trace.ActionTraceEvent = { type: 'event', metadata, hasSnapshot: false };
this._appendTraceEvent(event); this._appendTraceEvent(event);
} }
@ -230,4 +225,8 @@ export class Tracing implements InstrumentationListener {
await fs.promises.appendFile(this._traceFile!, JSON.stringify(event) + '\n'); await fs.promises.appendFile(this._traceFile!, JSON.stringify(event) + '\n');
}); });
} }
private _shouldCaptureSnapshot(metadata: CallMetadata): boolean {
return commandsWithTracingSnapshots.has(metadata.type + '.' + metadata.method);
}
} }

View file

@ -76,7 +76,8 @@ export class TraceModel {
} }
case 'action': { case 'action': {
const metadata = event.metadata; const metadata = event.metadata;
if (metadata.pageId) const include = typeof event.hasSnapshot !== 'boolean' || event.hasSnapshot;
if (include && metadata.pageId)
this._pageEntry(metadata.pageId).actions.push(event); this._pageEntry(metadata.pageId).actions.push(event);
break; break;
} }

View file

@ -167,6 +167,8 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
}; };
`]; `];
const tracingSnapshots = [];
const yml = fs.readFileSync(path.join(__dirname, '..', 'src', 'protocol', 'protocol.yml'), 'utf-8'); const yml = fs.readFileSync(path.join(__dirname, '..', 'src', 'protocol', 'protocol.yml'), 'utf-8');
const protocol = yaml.parse(yml); const protocol = yaml.parse(yml);
@ -208,6 +210,8 @@ for (const [name, item] of Object.entries(protocol)) {
for (let [methodName, method] of Object.entries(item.commands || {})) { for (let [methodName, method] of Object.entries(item.commands || {})) {
if (method === null) if (method === null)
method = {}; method = {};
if (method.tracing && method.tracing.snapshot)
tracingSnapshots.push(name + '.' + methodName);
const parameters = objectType(method.parameters || {}, ''); const parameters = objectType(method.parameters || {}, '');
const paramsName = `${channelName}${titleCase(methodName)}Params`; const paramsName = `${channelName}${titleCase(methodName)}Params`;
const optionsName = `${channelName}${titleCase(methodName)}Options`; const optionsName = `${channelName}${titleCase(methodName)}Options`;
@ -238,6 +242,10 @@ for (const [name, item] of Object.entries(protocol)) {
} }
} }
channels_ts.push(`export const commandsWithTracingSnapshots = new Set([
'${tracingSnapshots.join(`',\n '`)}'
]);`);
validator_ts.push(` validator_ts.push(`
return scheme; return scheme;
} }