diff --git a/packages/webdriver-utils/package.json b/packages/webdriver-utils/package.json index 5ad269932..59af55c6e 100644 --- a/packages/webdriver-utils/package.json +++ b/packages/webdriver-utils/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@percy/config": "1.27.3", - "@percy/sdk-utils": "1.27.3" + "@percy/sdk-utils": "1.27.3", + "colors": "^1.4.0" } } diff --git a/packages/webdriver-utils/src/providers/genericProvider.js b/packages/webdriver-utils/src/providers/genericProvider.js index bacf51903..050e0618d 100644 --- a/packages/webdriver-utils/src/providers/genericProvider.js +++ b/packages/webdriver-utils/src/providers/genericProvider.js @@ -4,6 +4,7 @@ import MetaDataResolver from '../metadata/metaDataResolver.js'; import Tile from '../util/tile.js'; import Driver from '../driver.js'; import Cache from '../util/cache.js'; +import CapabilitiesValidator from '../util/capabilityValidator.js'; const { request } = utils; const DEVICES_CONFIG_URL = 'https://storage.googleapis.com/percy-utils/devices.json'; @@ -47,6 +48,9 @@ export default class GenericProvider { log.debug(`Passed capabilities -> ${JSON.stringify(this.capabilities)}`); const caps = await this.driver.getCapabilites(); log.debug(`Fetched capabilities -> ${JSON.stringify(caps)}`); + log.debug('Validating Capabilites'); + const validator = new CapabilitiesValidator(caps); + validator.validateBrowserOSVersions(); this.metaData = await MetaDataResolver.resolve(this.driver, caps, this.capabilities); } diff --git a/packages/webdriver-utils/src/util/capabilityValidator.js b/packages/webdriver-utils/src/util/capabilityValidator.js new file mode 100644 index 000000000..89abc89e7 --- /dev/null +++ b/packages/webdriver-utils/src/util/capabilityValidator.js @@ -0,0 +1,65 @@ +import fs from 'fs'; +import path from 'path'; +import colors from 'colors/safe.js'; + +export default class CapabilitiesValidator { + constructor(capabilities) { + this.capabilities = capabilities; + } + + validateBrowserOSVersions() { + const cwd = process.cwd(); + const excludeBrowserData = JSON.parse( + fs.readFileSync( + path.join( + cwd, + 'packages/webdriver-utils/src/util/exclude_browsers.json' + ) + ) + ); + + const { os, osVersion, browserName, browserVersion } = this.capabilities; + + if (!os || !osVersion || !browserName || !browserVersion) { + colors.yellow( + console.warn( + `OS/Browser Combination ${os}: ${osVersion}: ${browserName} ${browserName} is not supported in Percy` + ) + ); + } + if (excludeBrowserData?.os[os]) { + const osData = excludeBrowserData?.os[os]; + if (osData?.os_versions) { + const osExists = osData.os_versions.some((element) => { + return element === osVersion; + }); + if (osExists) { + colors.yellow( + console.warn( + `OS Version ${os}: ${osVersion} is not supported in Percy` + ) + ); + } + } + if (osData?.browsers) { + const browserData = osData?.browsers[browserName.toLowerCase()]; + if (browserData && browserData.min_version === 'all') { + console.warn( + colors.yellow( + `Browser ${browserName} is not supported in Percy on ${os} ${osVersion}` + ) + ); + } else if ( + browserData && + parseInt(browserVersion, 10) < parseInt(browserData.min_version, 10) + ) { + console.warn( + colors.yellow( + `Browser Version ${browserName}: ${browserVersion} is not supported in Percy on ${os} ${osVersion}` + ) + ); + } + } + } + } +} diff --git a/packages/webdriver-utils/src/util/exclude_browsers.json b/packages/webdriver-utils/src/util/exclude_browsers.json new file mode 100644 index 000000000..f928a79eb --- /dev/null +++ b/packages/webdriver-utils/src/util/exclude_browsers.json @@ -0,0 +1,35 @@ +{ + "os": { + "OS X": { + "os_versions": ["Snow Leopard", "Lion", "Mountain Lion", "Mavericks", "Yosemite", "El Capitan", "Sierra", "High Sierra", "Mojave"], + "browsers": { + "chrome": { + "min_version": "92" + }, + "firefox": { + "min_version": "92" + }, + "edge": { + "min_version": "92" + } + } + }, + "Windows": { + "os_versions": ["8.1", "8.0", "7", "XP"], + "browsers": { + "chrome": { + "min_version": "92" + }, + "firefox": { + "min_version": "92" + }, + "edge": { + "min_version": "92" + }, + "ie": { + "min_version": "all" + } + } + } + } +} \ No newline at end of file