MCPcopy Index your code
hub / github.com/codeceptjs/CodeceptJS / saveScreenshot

Method saveScreenshot

lib/helper/Playwright.js:2960–3033  ·  view source on GitHub ↗

* {{> saveScreenshot }}

(fileName, fullPage)

Source from the content-addressed store, hash-verified

2958 * {{> saveScreenshot }}
2959 */
2960 async saveScreenshot(fileName, fullPage) {
2961 const fullPageOption = fullPage || this.options.fullPageScreenshots
2962 let outputFile = screenshotOutputFolder(fileName)
2963
2964 this.debugSection('Screenshot', relativeDir(outputFile))
2965
2966 if (!this.page || !this.browser || !this.browserContext) {
2967 this.debug(`Cannot take screenshot: page=${!!this.page}, browser=${!!this.browser}, browserContext=${!!this.browserContext}`)
2968 return
2969 }
2970 if (this.page.isClosed && this.page.isClosed()) {
2971 this.debug('Cannot take screenshot: page is closed')
2972 return
2973 }
2974
2975 try {
2976 await Promise.race([
2977 this.page.screenshot({
2978 path: outputFile,
2979 fullPage: fullPageOption,
2980 type: 'png',
2981 }),
2982 new Promise((_, reject) => setTimeout(() => reject(new Error('Screenshot timeout')), 5000)),
2983 ])
2984 } catch (err) {
2985 this.debug(`Failed to take screenshot: ${err.message}`)
2986
2987 this.hasCleanupError = true
2988 this.testFailures.push(`Screenshot failed: ${err.message}`)
2989
2990 if (err.message.includes('closed') || err.message.includes('Protocol error') || err.message.includes('timeout')) {
2991 this.debug('Screenshot failed due to browser/page closure or timeout, continuing...')
2992 return
2993 }
2994 throw err
2995 }
2996
2997 // Handle session screenshots for ALL sessions, not just active one
2998 if (this.sessionPages && Object.keys(this.sessionPages).length > 0) {
2999 for (const sessionName in this.sessionPages) {
3000 const sessionPage = this.sessionPages[sessionName]
3001 outputFile = screenshotOutputFolder(`${sessionName}_${fileName}`)
3002
3003 this.debugSection('Screenshot', `${sessionName} - ${relativeDir(outputFile)}`)
3004
3005 try {
3006 // Add timeout protection for session screenshots
3007 await Promise.race([
3008 (async () => {
3009 if (sessionPage && !sessionPage.isClosed()) {
3010 await sessionPage.screenshot({
3011 path: outputFile,
3012 fullPage: fullPageOption,
3013 type: 'png',
3014 })
3015 } else {
3016 this.debug(`Cannot take session screenshot: session page for '${sessionName}' is closed or undefined`)
3017 }

Callers

nothing calls this directly

Calls 5

screenshotOutputFolderFunction · 0.90
relativeDirFunction · 0.90
debugMethod · 0.80
pushMethod · 0.80
includesMethod · 0.80

Tested by

no test coverage detected