import InsightsHandler from '../insights-handler.js'
import TestReporter from '../reporter.js'
import { PercyLogger } from './PercyLogger.js'
import { isUndefined } from '../util.js'
const tryRequire = async function (pkg: string, fallback: unknown) {
try {
return (await import(pkg)).default
} catch {
return fallback
}
}
const percySnapshot = await tryRequire('@percy/selenium-webdriver', null)
const percyAppScreenshot = await tryRequire('@percy/appium-app', {})
let snapshotHandler = (...args: unknown[]) => {
PercyLogger.error('Unsupported driver for percy')
}
if (percySnapshot) {
snapshotHandler = (browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser, snapshotName: string, options?: { [key: string]: unknown }) => {
if (process.env.PERCY_SNAPSHOT === 'true') {
let { name, uuid } = InsightsHandler.currentTest
if (isUndefined(name)) {
({ name, uuid } = TestReporter.currentTest)
}
options ||= {}
options = {
...options,
testCase: name || ''
}
return percySnapshot(browser, snapshotName, options)
}
}
}
export const snapshot = snapshotHandler
This is a helper method which appends some internal fields
to the options object being sent to Percy methods
*/
const screenshotHelper = (type: string, driverOrName: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser | string, nameOrOptions?: string | { [key: string]: unknown }, options?: { [key: string]: unknown }) => {
let { name, uuid } = InsightsHandler.currentTest
if (isUndefined(name)) {
({ name, uuid } = TestReporter.currentTest)
}
if (!driverOrName || typeof driverOrName === 'string') {
nameOrOptions ||= {}
if (typeof nameOrOptions === 'object') {
nameOrOptions = {
...nameOrOptions,
testCase: name || ''
}
}
} else {
options ||= {}
options = {
...options,
testCase: name || ''
}
}
if (type === 'app') {
return percyAppScreenshot(driverOrName, nameOrOptions, options)
}
return percySnapshot.percyScreenshot(driverOrName, nameOrOptions, options)
}
let screenshotHandler = async (...args: unknown[]) => {
PercyLogger.error('Unsupported driver for percy')
}
if (percySnapshot && percySnapshot.percyScreenshot) {
screenshotHandler = (browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser | string, screenshotName?: string | { [key: string]: unknown }, options?: { [key: string]: unknown }) => {
return screenshotHelper('web', browser, screenshotName, options)
}
}
export const screenshot = screenshotHandler
let screenshotAppHandler = async (...args: unknown[]) => {
PercyLogger.error('Unsupported driver for percy')
}
if (percyAppScreenshot) {
screenshotAppHandler = (driverOrName: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser | string, nameOrOptions?: string | { [key: string]: unknown }, options?: { [key: string]: unknown }) => {
return screenshotHelper('app', driverOrName, nameOrOptions, options)
}
}
export const screenshotApp = screenshotAppHandler