Skip to content

Commit b405a36

Browse files
authored
feat(plugin): coverage with WebDriver - devtools (#4349)
1 parent 8018aa2 commit b405a36

File tree

5 files changed

+103
-5
lines changed

5 files changed

+103
-5
lines changed

lib/helper/WebDriver.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,7 @@ class WebDriver extends Helper {
642642

643643
if (this.options.automationProtocol) {
644644
this.puppeteerBrowser = await this.browser.getPuppeteer();
645+
this.page = (await this.puppeteerBrowser.pages())[0];
645646
}
646647

647648
return this.browser;
@@ -2731,7 +2732,6 @@ class WebDriver extends Helper {
27312732
this.recording = true;
27322733
this.recordedAtLeastOnce = true;
27332734

2734-
this.page = (await this.puppeteerBrowser.pages())[0];
27352735
await this.page.setRequestInterception(true);
27362736

27372737
this.page.on('request', (request) => {

lib/plugin/coverage.js

+34-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const defaultConfig = {
1111
outputDir: 'output/coverage',
1212
};
1313

14-
const supportedHelpers = ['Puppeteer', 'Playwright'];
14+
const supportedHelpers = ['Puppeteer', 'Playwright', 'WebDriver'];
1515

1616
const v8CoverageHelpers = {
1717
Playwright: {
@@ -61,6 +61,33 @@ const v8CoverageHelpers = {
6161
await coverageReport.add(coverageList);
6262
},
6363
},
64+
WebDriver: {
65+
startCoverage: async (page) => {
66+
await Promise.all([
67+
page.coverage.startJSCoverage({
68+
resetOnNavigation: false,
69+
includeRawScriptCoverage: true,
70+
}),
71+
page.coverage.startCSSCoverage({
72+
resetOnNavigation: false,
73+
}),
74+
]);
75+
},
76+
takeCoverage: async (page, coverageReport) => {
77+
const [jsCoverage, cssCoverage] = await Promise.all([
78+
page.coverage.stopJSCoverage(),
79+
page.coverage.stopCSSCoverage(),
80+
]);
81+
// to raw V8 script coverage
82+
const coverageList = [...jsCoverage.map((it) => {
83+
return {
84+
source: it.text,
85+
...it.rawScriptCoverage,
86+
};
87+
}), ...cssCoverage];
88+
await coverageReport.add(coverageList);
89+
},
90+
},
6491
};
6592

6693
/**
@@ -109,11 +136,17 @@ module.exports = function (config) {
109136
const debug = debugModule(`codeceptjs:plugin:${helperName.toLowerCase()}Coverage`);
110137

111138
const helper = helpers[helperName];
139+
140+
if (helperName === 'WebDriver' && !helper.config.devtoolsProtocol) throw Error('Coverage is currently supporting the WebDriver running with Devtools protocol.');
141+
112142
const v8Helper = v8CoverageHelpers[helperName];
113143

114144
const coverageOptions = {
115145
...config,
116146
};
147+
148+
if (helperName === 'WebDriver') coverageOptions.coverageProvider = 'v8';
149+
117150
const coverageReport = new CoverageReport(coverageOptions);
118151
coverageReport.cleanCache();
119152

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
"lodash.merge": "4.6.2",
105105
"mkdirp": "1.0.4",
106106
"mocha": "10.4.0",
107-
"monocart-coverage-reports": "2.7.4",
107+
"monocart-coverage-reports": "2.8.2",
108108
"ms": "2.1.3",
109109
"ora-classic": "5.4.2",
110110
"pactum": "3.6.7",
@@ -179,4 +179,4 @@
179179
"strict": false
180180
}
181181
}
182-
}
182+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const TestHelper = require('../support/TestHelper');
2+
3+
module.exports.config = {
4+
tests: './*_test.js',
5+
timeout: 10000,
6+
output: './output',
7+
helpers: {
8+
WebDriver: {
9+
url: TestHelper.siteUrl(),
10+
browser: 'Chromium',
11+
windowSize: '500x700',
12+
devtoolsProtocol: true,
13+
waitForTimeout: 5000,
14+
capabilities: {
15+
chromeOptions: {
16+
args: ['--headless', '--disable-gpu', '--window-size=500,700'],
17+
},
18+
},
19+
},
20+
ScreenshotSessionHelper: {
21+
require: '../support/ScreenshotSessionHelper.js',
22+
outputPath: './output',
23+
},
24+
Expect: {},
25+
},
26+
include: {},
27+
mocha: {},
28+
name: 'acceptance',
29+
plugins: {
30+
screenshotOnFail: {
31+
enabled: true,
32+
},
33+
coverage: {
34+
enabled: true,
35+
debug: true,
36+
name: 'CodeceptJS Coverage Report',
37+
sourceFilter: '**/src/**',
38+
sourcePath: {
39+
'todomvc-react/': '',
40+
'todomvc.com/examples/react/': '',
41+
},
42+
outputDir: 'output/coverage',
43+
},
44+
},
45+
gherkin: {
46+
features: './gherkin/*.feature',
47+
steps: ['./gherkin/steps.js'],
48+
},
49+
};

test/plugin/plugin_test.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,23 @@ describe('CodeceptJS plugin', function () {
3838
expect(lines).toEqual(
3939
expect.arrayContaining([
4040
expect.stringContaining('writing output/coverage'),
41-
expect.stringContaining('generated coverage reports: output/coverage/index.html'),
41+
expect.stringContaining('generated coverage reports:'),
42+
expect.stringContaining('output/coverage/index.html')
43+
]),
44+
);
45+
expect(err).toBeFalsy();
46+
done();
47+
});
48+
});
49+
50+
it('should generate the coverage report - WebDriver - Devtools protocol', (done) => {
51+
exec(`${config_run_config('codecept.WebDriver.devtools.coverage.js', '@coverage')} --debug`, (err, stdout) => {
52+
const lines = stdout.split('\n');
53+
expect(lines).toEqual(
54+
expect.arrayContaining([
55+
expect.stringContaining('writing output/coverage'),
56+
expect.stringContaining('generated coverage reports:'),
57+
expect.stringContaining('output/coverage/index.html')
4258
]),
4359
);
4460
expect(err).toBeFalsy();

0 commit comments

Comments
 (0)