Skip to content

Commit d5e3087

Browse files
feat: grab metrics playwright (#3809)
* feat: grab metrics playwright * fix: increase timeout for UTs --------- Co-authored-by: Michael Bodnarchuk <[email protected]>
1 parent 3814cc2 commit d5e3087

File tree

4 files changed

+158
-1
lines changed

4 files changed

+158
-1
lines changed

.github/workflows/playwright.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,4 @@ jobs:
5151
- name: run webkit tests
5252
run: "BROWSER=webkit node ./bin/codecept.js run -c test/acceptance/codecept.Playwright.js --grep @Playwright --debug"
5353
- name: run unit tests
54-
run: ./node_modules/.bin/mocha test/helper/Playwright_test.js
54+
run: ./node_modules/.bin/mocha test/helper/Playwright_test.js --timeout 5000

docs/helpers/Playwright.md

+54
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,60 @@ let postHTMLs = await I.grabHTMLFromAll('.post');
11141114

11151115
Returns **[Promise][21]&lt;[Array][9]&lt;[string][8]>>** HTML code for an element
11161116

1117+
### grabMetrics
1118+
1119+
Return a performance metric from the chrome cdp session.
1120+
Note: Chrome-only
1121+
1122+
Examples:
1123+
1124+
```js
1125+
const metrics = await I.grabMetrics();
1126+
1127+
// returned metrics
1128+
1129+
[
1130+
{ name: 'Timestamp', value: 1584904.203473 },
1131+
{ name: 'AudioHandlers', value: 0 },
1132+
{ name: 'AudioWorkletProcessors', value: 0 },
1133+
{ name: 'Documents', value: 22 },
1134+
{ name: 'Frames', value: 10 },
1135+
{ name: 'JSEventListeners', value: 366 },
1136+
{ name: 'LayoutObjects', value: 1240 },
1137+
{ name: 'MediaKeySessions', value: 0 },
1138+
{ name: 'MediaKeys', value: 0 },
1139+
{ name: 'Nodes', value: 4505 },
1140+
{ name: 'Resources', value: 141 },
1141+
{ name: 'ContextLifecycleStateObservers', value: 34 },
1142+
{ name: 'V8PerContextDatas', value: 4 },
1143+
{ name: 'WorkerGlobalScopes', value: 0 },
1144+
{ name: 'UACSSResources', value: 0 },
1145+
{ name: 'RTCPeerConnections', value: 0 },
1146+
{ name: 'ResourceFetchers', value: 22 },
1147+
{ name: 'AdSubframes', value: 0 },
1148+
{ name: 'DetachedScriptStates', value: 2 },
1149+
{ name: 'ArrayBufferContents', value: 1 },
1150+
{ name: 'LayoutCount', value: 0 },
1151+
{ name: 'RecalcStyleCount', value: 0 },
1152+
{ name: 'LayoutDuration', value: 0 },
1153+
{ name: 'RecalcStyleDuration', value: 0 },
1154+
{ name: 'DevToolsCommandDuration', value: 0.000013 },
1155+
{ name: 'ScriptDuration', value: 0 },
1156+
{ name: 'V8CompileDuration', value: 0 },
1157+
{ name: 'TaskDuration', value: 0.000014 },
1158+
{ name: 'TaskOtherDuration', value: 0.000001 },
1159+
{ name: 'ThreadTime', value: 0.000046 },
1160+
{ name: 'ProcessTime', value: 0.616852 },
1161+
{ name: 'JSHeapUsedSize', value: 19004908 },
1162+
{ name: 'JSHeapTotalSize', value: 26820608 },
1163+
{ name: 'FirstMeaningfulPaint', value: 0 },
1164+
{ name: 'DomContentLoaded', value: 1584903.690491 },
1165+
{ name: 'NavigationStart', value: 1584902.841845 }
1166+
]
1167+
```
1168+
1169+
Returns **[Promise][20]&lt;[Array][22]&lt;[Object][5]>>**
1170+
11171171
### grabNumberOfOpenTabs
11181172

11191173
Grab number of open tabs.

lib/helper/Playwright.js

+61
Original file line numberDiff line numberDiff line change
@@ -3124,6 +3124,67 @@ class Playwright extends Helper {
31243124
flushWebSocketMessages() {
31253125
this.webSocketMessages = [];
31263126
}
3127+
3128+
/**
3129+
* Return a performance metric from the chrome cdp session.
3130+
* Note: Chrome-only
3131+
*
3132+
* Examples:
3133+
*
3134+
* ```js
3135+
* const metrics = await I.grabMetrics();
3136+
*
3137+
* // returned metrics
3138+
*
3139+
* [
3140+
* { name: 'Timestamp', value: 1584904.203473 },
3141+
* { name: 'AudioHandlers', value: 0 },
3142+
* { name: 'AudioWorkletProcessors', value: 0 },
3143+
* { name: 'Documents', value: 22 },
3144+
* { name: 'Frames', value: 10 },
3145+
* { name: 'JSEventListeners', value: 366 },
3146+
* { name: 'LayoutObjects', value: 1240 },
3147+
* { name: 'MediaKeySessions', value: 0 },
3148+
* { name: 'MediaKeys', value: 0 },
3149+
* { name: 'Nodes', value: 4505 },
3150+
* { name: 'Resources', value: 141 },
3151+
* { name: 'ContextLifecycleStateObservers', value: 34 },
3152+
* { name: 'V8PerContextDatas', value: 4 },
3153+
* { name: 'WorkerGlobalScopes', value: 0 },
3154+
* { name: 'UACSSResources', value: 0 },
3155+
* { name: 'RTCPeerConnections', value: 0 },
3156+
* { name: 'ResourceFetchers', value: 22 },
3157+
* { name: 'AdSubframes', value: 0 },
3158+
* { name: 'DetachedScriptStates', value: 2 },
3159+
* { name: 'ArrayBufferContents', value: 1 },
3160+
* { name: 'LayoutCount', value: 0 },
3161+
* { name: 'RecalcStyleCount', value: 0 },
3162+
* { name: 'LayoutDuration', value: 0 },
3163+
* { name: 'RecalcStyleDuration', value: 0 },
3164+
* { name: 'DevToolsCommandDuration', value: 0.000013 },
3165+
* { name: 'ScriptDuration', value: 0 },
3166+
* { name: 'V8CompileDuration', value: 0 },
3167+
* { name: 'TaskDuration', value: 0.000014 },
3168+
* { name: 'TaskOtherDuration', value: 0.000001 },
3169+
* { name: 'ThreadTime', value: 0.000046 },
3170+
* { name: 'ProcessTime', value: 0.616852 },
3171+
* { name: 'JSHeapUsedSize', value: 19004908 },
3172+
* { name: 'JSHeapTotalSize', value: 26820608 },
3173+
* { name: 'FirstMeaningfulPaint', value: 0 },
3174+
* { name: 'DomContentLoaded', value: 1584903.690491 },
3175+
* { name: 'NavigationStart', value: 1584902.841845 }
3176+
* ]
3177+
*
3178+
* ```
3179+
*
3180+
* @return {Promise<Array<Object>>}
3181+
*/
3182+
async grabMetrics() {
3183+
const client = await this.page.context().newCDPSession(this.page);
3184+
await client.send('Performance.enable');
3185+
const perfMetricObject = await client.send('Performance.getMetrics');
3186+
return perfMetricObject?.metrics;
3187+
}
31273188

31283189
_getWebSocketMessage(payload) {
31293190
if (payload.errorMessage) {

test/helper/Playwright_test.js

+42
Original file line numberDiff line numberDiff line change
@@ -1405,6 +1405,48 @@ describe('Playwright - Electron', () => {
14051405
});
14061406
});
14071407

1408+
describe('Playwright - Performance Metrics', () => {
1409+
before(() => {
1410+
global.codecept_dir = path.join(__dirname, '/../data');
1411+
global.output_dir = path.join(`${__dirname}/../data/output`);
1412+
1413+
I = new Playwright({
1414+
url: siteUrl,
1415+
windowSize: '500x700',
1416+
show: false,
1417+
restart: true,
1418+
browser: 'chromium',
1419+
trace: true,
1420+
video: true,
1421+
});
1422+
I._init();
1423+
return I._beforeSuite();
1424+
});
1425+
1426+
beforeEach(async () => {
1427+
webApiTests.init({
1428+
I, siteUrl,
1429+
});
1430+
deleteDir(path.join(global.output_dir, 'video'));
1431+
return I._before().then(() => {
1432+
page = I.page;
1433+
browser = I.browser;
1434+
});
1435+
});
1436+
1437+
afterEach(async () => {
1438+
return I._after();
1439+
});
1440+
1441+
it('grabs performance metrics', async () => {
1442+
await I.amOnPage('https://codecept.io');
1443+
const metrics = await I.grabMetrics();
1444+
console.log(metrics);
1445+
expect(metrics.length).to.greaterThan(0);
1446+
expect(metrics[0].name).to.equal('Timestamp');
1447+
});
1448+
});
1449+
14081450
describe('Playwright - Video & Trace', () => {
14091451
before(() => {
14101452
global.codecept_dir = path.join(__dirname, '/../data');

0 commit comments

Comments
 (0)