Skip to content

Commit dc0f1d0

Browse files
Merge pull request #46 from germanbisogno/develop
Develop
2 parents 018a49a + 3eb6a74 commit dc0f1d0

14 files changed

Lines changed: 102 additions & 30 deletions

.DS_Store

6 KB
Binary file not shown.

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [1.5.1] - 2024-02-17
6+
7+
### Added
8+
9+
- Adding new dependency chrome-har-capturer to use fromLog API to export to HAR format in Network tracing.
10+
- Including websocket events to observe and include in Har file.
11+
512
## [1.5.0] - 2023-03-16
613

714
### Added

config/cdp.config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
]
2323
}
2424
},
25+
"url": "http://localhost:3000",
2526
"cdpPort": 9222,
2627
"maxTimeout": 50000
2728
}

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"types": "dist/index.d.ts",
1111
"scripts": {
1212
"build": "tsc",
13-
"test": "mocha --require ts-node/register --parallel",
13+
"test": "mocha --require ts-node/register --exit --parallel",
1414
"format": "prettier --write src/**/*.ts",
1515
"prebuild": "npm run lint && npm run format",
1616
"lint": "eslint --fix ./src/**/*.ts",
@@ -33,6 +33,7 @@
3333
"@compodoc/compodoc": "^1.1.16",
3434
"@types/chai": "^4.3.4",
3535
"@types/chrome-remote-interface": "0.31.9",
36+
"@types/express": "^4.17.21",
3637
"@types/mocha": "^10.0.1",
3738
"@types/selenium-webdriver": "^4.0.16",
3839
"@types/sinon": "^10.0.13",
@@ -46,13 +47,15 @@
4647
"eslint": "^8.27.0",
4748
"eslint-config-prettier": "^8.5.0",
4849
"eslint-plugin-prettier": "^4.2.1",
50+
"express": "^4.18.2",
4951
"mocha": "^10.2.0",
5052
"prettier": "^2.4.1",
5153
"selenium-webdriver": "^4.8.1",
5254
"sinon": "^15.0.2",
5355
"ts-node": "^10.9.1",
5456
"typed-query-selector": "^2.6.1",
55-
"typescript": "^4.4.4"
57+
"typescript": "^4.4.4",
58+
"ws": "^8.16.0"
5659
},
5760
"dependencies": {
5861
"@influxdata/influxdb-client": "^1.33.2",
@@ -61,6 +64,7 @@
6164
"@types/node": "^17.0.14",
6265
"axios": "^1.6.0",
6366
"chrome-har": "^0.12.0",
67+
"chrome-har-capturer": "^0.14.0",
6468
"chrome-remote-interface": "^0.33.0",
6569
"devtools-protocol": "0.0.1055124",
6670
"lighthouse": "10.0.2",

src/__tests__/network.test.ts

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,44 @@
11
import { Builder } from 'selenium-webdriver';
22
import * as chrome from 'selenium-webdriver/chrome';
33
import 'chromedriver';
4-
import { GooglePage } from '../pages/googlePage';
54
import { Network } from '../network';
65
import { CDPClient } from '../cdpClient';
76
import { getFreePort } from 'endpoint-utils';
87
import { Har } from 'har-format';
98
import { expect } from 'chai';
9+
import { WebSocketPage } from '../pages/webSocketPage';
10+
import express, { Express } from "express";
11+
import { WebSocketServer } from 'ws';
12+
13+
let server;
14+
15+
before(function(){
16+
const app: Express = express();
17+
server = app.use((req, res) =>
18+
res.sendFile('./websocket-client.html', { root: "./src/__tests__/server" })
19+
).listen(3000, () => console.log(`Listening on ${3000}`))
20+
21+
const sockserver = new WebSocketServer({ port: 443 })
22+
sockserver.on('connection', ws => {
23+
console.log('New client connected!')
24+
ws.send('connection established')
25+
ws.on('close', () => console.log('Client has disconnected!'))
26+
ws.on('message', data => {
27+
sockserver.clients.forEach(client => {
28+
console.log(`distributing message: ${data}`)
29+
client.send(`${data}`)
30+
})
31+
})
32+
ws.onerror = function () {
33+
console.log('websocket error')
34+
}
35+
})
36+
});
37+
38+
after(async () => {
39+
await server.close();
40+
});
41+
1042

1143
it('Test Network', async () => {
1244
const port = await getFreePort();
@@ -19,17 +51,17 @@ it('Test Network', async () => {
1951
.setChromeOptions(options)
2052
.build();
2153

22-
const googlePage = new GooglePage(driver);
54+
const webSocketPage = new WebSocketPage(driver);
2355
const cdpClient = new CDPClient();
2456
await cdpClient.init(port);
2557

2658
const network = new Network(cdpClient, 'network.har');
2759

2860
await network.startTrace();
2961

30-
await driver.get('https://www.google.com');
62+
await driver.get('http://localhost:3000');
3163

32-
await googlePage.search('test');
64+
await webSocketPage.sendMessage('test');
3365

3466
const networkResults: Har = await network.stopTrace();
3567
expect(networkResults.log.entries.length).greaterThan(0);

src/config/cdpConfig.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface CDPConfig {
55
tracing: Protocol.Tracing.StartRequest;
66
cdpPort: number;
77
maxTimeout: number;
8+
url: string;
89
}
910

1011
export const cdpConfig: CDPConfig = JSON.parse(

src/lighthouse.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
import * as LH from 'lighthouse';
22
import { FlowResult, startFlow, UserFlow } from 'lighthouse';
3-
import { TraceOperations } from './traceOperations';
43
import * as fs from 'fs';
54
import puppeteer from 'puppeteer';
65
import axios from 'axios';
76

8-
export class Lighthouse extends TraceOperations {
7+
export class Lighthouse {
98
private _flow: UserFlow;
109
private _report: string;
1110
private _port: number;
1211
private _browser: puppeteer.Browser | undefined;
1312

1413
constructor(port: number) {
15-
super();
1614
this._port = port;
1715
}
1816

src/network.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import * as fs from 'fs';
2-
import { harFromMessages } from 'chrome-har';
32
import { TraceOperations } from './traceOperations';
43
import { logger } from './utils/logger';
54
import { NetworkConditions } from './interfaces/networkConditions';
65
import { Har } from 'har-format';
76
import { CDPClient } from './cdpClient';
8-
import CDP from 'chrome-remote-interface';
97
import Protocol from 'devtools-protocol';
8+
import { fromLog } from 'chrome-har-capturer';
9+
import { cdpConfig } from './config/cdpConfig';
1010

1111
// event types to observe
1212
const observe = [
1313
'Page.loadEventFired',
1414
'Page.domContentEventFired',
15+
'Page.navigatedWithinDocument',
1516
'Page.frameStartedLoading',
16-
'Page.frameAttached',
17+
'Page.frameAttached',
1718
'Network.requestWillBeSent',
1819
'Network.requestServedFromCache',
1920
'Network.dataReceived',
@@ -22,6 +23,13 @@ const observe = [
2223
'Network.loadingFinished',
2324
'Network.loadingFailed',
2425
'Network.requestFinished',
26+
'Network.webSocketFrameReceived',
27+
'Network.webSocketFrameSent',
28+
'Network.getResponseBody',
29+
'Network.webSocketWillSendHandshakeRequest',
30+
'Network.webSocketHandshakeResponseReceived',
31+
'Network.webSocketClosed',
32+
'Network.resourceChangedPriority'
2533
];
2634

2735
export const NETWORK_PRESETS = {
@@ -78,11 +86,9 @@ export const NETWORK_PRESETS = {
7886
export class Network extends TraceOperations {
7987
private _traceFileName: string;
8088
protected _events: { method: string; params: object }[] = [];
81-
private _client: CDP.Client;
8289

8390
constructor(cdpClient: CDPClient, traceFileName = '') {
84-
super();
85-
this._client = cdpClient.get();
91+
super(cdpClient);
8692
this._traceFileName = traceFileName;
8793
}
8894

@@ -113,9 +119,7 @@ export class Network extends TraceOperations {
113119
*/
114120
public async stopTrace(): Promise<Har> {
115121
try {
116-
const har = await harFromMessages(this._events, {
117-
includeTextFromResponseBody: true,
118-
});
122+
const har = await fromLog(cdpConfig.url, this._events);
119123
if (this._traceFileName) {
120124
fs.writeFileSync(this._traceFileName, JSON.stringify(har));
121125
}

src/pages/webSocketPage.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { By, WebDriver, Key } from 'selenium-webdriver';
2+
import { elementLocated } from 'selenium-webdriver/lib/until';
3+
import { cdpConfig } from '../config/cdpConfig';
4+
5+
export class WebSocketPage {
6+
private _driver: WebDriver;
7+
private message: By = By.name('message');
8+
9+
constructor(driver: WebDriver) {
10+
this._driver = driver;
11+
}
12+
13+
async sendMessage(message: string): Promise<void> {
14+
const el = await this._driver.wait(
15+
elementLocated(this.message),
16+
cdpConfig.maxTimeout
17+
);
18+
await el.sendKeys(message);
19+
await el.sendKeys(Key.RETURN);
20+
}
21+
}

src/performance.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,17 @@ import { logger } from './utils/logger';
33
import { Protocol } from 'devtools-protocol';
44
import * as fs from 'fs';
55
import { CDPClient } from './cdpClient';
6-
import CDP from 'chrome-remote-interface';
76

87
export class Performance extends TraceOperations {
98
private _startTraceFileName: string;
109
private _endTraceFileName: string;
11-
private _client: CDP.Client;
1210

1311
constructor(
1412
cdpClient: CDPClient,
1513
startTraceFileName = '',
1614
endTraceFileName = ''
1715
) {
18-
super();
16+
super(cdpClient);
1917
this._client = cdpClient.get();
2018
this._startTraceFileName = startTraceFileName;
2119
this._endTraceFileName = endTraceFileName;

0 commit comments

Comments
 (0)