* {{> saveScreenshot }}
(fileName, fullPage)
| 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 | } |
nothing calls this directly
no test coverage detected