Skip to content

Commit ac4d5cf

Browse files
Improve capture screenshots when selenium test fails
1
1 parent 8929bc5 commit ac4d5cf

3 files changed

Lines changed: 50 additions & 2 deletions

File tree

selenium/test/queuesAndStreams/autodelete-mqtt-qos0.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ describe('Given an MQTT 5.0 connection with a qos 0 subscription with zero sessi
2020
let overview
2121
let captureScreen
2222
let queueName
23+
let connectionsPage
2324

2425
let mqttClient
2526

selenium/test/queuesAndStreams/view-mqtt-qos0.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const fs = require('fs')
12
const { By, Key, until, Builder } = require('selenium-webdriver')
23
require('chromedriver')
34
const assert = require('assert')
@@ -20,6 +21,8 @@ describe('Given a mqtt 5.0 connection with a qos 0 subscription with zero sessio
2021
let captureScreen
2122
let queueName
2223
let mqttOptions
24+
let connectionsPage
25+
let queuesAndStreamsPage
2326

2427
let mqttProtocol = process.env.MQTT_PROTOCOL || 'mqtt'
2528
let usemtls = process.env.MQTT_USE_MTLS || false

selenium/test/utils.js

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,13 @@ function getRandomInt(max) {
3030
class CaptureScreenshot {
3131
driver
3232
test
33+
/** When true, teardown skips after-failed.png (named failure shot already taken in afterEach). */
34+
_suppressTeardownFailureShot
35+
3336
constructor (webdriver, test) {
3437
this.driver = webdriver
3538
this.test = test
39+
this._suppressTeardownFailureShot = false
3640
}
3741

3842
async shot (name) {
@@ -47,6 +51,23 @@ class CaptureScreenshot {
4751
}
4852
}
4953

54+
/**
55+
* Turn a Mocha test title into a single path segment (no timestamp).
56+
*/
57+
function sanitizeScreenshotFileName (title) {
58+
if (!title || typeof title !== 'string') {
59+
return 'unnamed-test'
60+
}
61+
let s = title
62+
.replace(/[/\\?%*:|"<>]/g, '-')
63+
.replace(/\s+/g, ' ')
64+
.trim()
65+
if (s.length > 200) {
66+
s = s.substring(0, 200)
67+
}
68+
return s.length > 0 ? s : 'unnamed-test'
69+
}
70+
5071
module.exports = {
5172
log: (message) => {
5273
if (debug) console.log(new Date() + " " + message)
@@ -177,6 +198,25 @@ module.exports = {
177198
return new CaptureScreenshot(d.driver, require('path').basename(test))
178199
},
179200

201+
/**
202+
* Call from afterEach: if the test that just finished failed, save a PNG named after
203+
* its full title (parent describes + it), with no timestamp.
204+
*/
205+
captureScreenshotIfFailed: async (captureScreen, mochaContext) => {
206+
if (captureScreen == null || mochaContext == null || !mochaContext.currentTest) {
207+
return
208+
}
209+
const ct = mochaContext.currentTest
210+
if (ct.isPassed() || ct.pending) {
211+
captureScreen._suppressTeardownFailureShot = false
212+
return
213+
}
214+
const fullTitle = typeof ct.fullTitle === 'function' ? ct.fullTitle() : ct.title
215+
const name = sanitizeScreenshotFileName(fullTitle)
216+
await captureScreen.shot(name)
217+
captureScreen._suppressTeardownFailureShot = true
218+
},
219+
180220
doUntil: async (doCallback, booleanCallback, delayMs = 1000, message = "doUntil failed") => {
181221
let done = false
182222
let attempts = 10
@@ -317,8 +357,12 @@ module.exports = {
317357
driver.executeScript('lambda-status=passed')
318358
} else {
319359
if (captureScreen != null) {
320-
console.log("Teardown failed . capture...");
321-
await captureScreen.shot('after-failed');
360+
if (captureScreen._suppressTeardownFailureShot) {
361+
captureScreen._suppressTeardownFailureShot = false
362+
} else {
363+
console.log("Teardown failed . capture...");
364+
await captureScreen.shot('after-failed');
365+
}
322366
}
323367
driver.executeScript('lambda-status=failed')
324368
}

0 commit comments

Comments
 (0)