import type { Capabilities, Options, Frameworks } from '@wdio/types'
import type { Options as BSOptions } from 'browserstack-local'
export type MultiRemoteAction = (sessionId: string, browserName?: string) => Promise<unknown>
export type AppConfig = {
id?: string,
path?: string,
custom_id?: string,
shareable_id?: string
}
export interface AppUploadResponse {
app_url?: string,
custom_id?: string,
shareable_id?: string
}
export interface App {
app?: string,
customId?: string
}
export interface TestObservabilityOptions {
buildName?: string,
projectName?: string,
buildTag?: string[],
user?: string,
key?: string,
* When set to true, hook failures will not influence the test status.
* Tests will be marked as "passed" if all test steps pass, even if hooks fail.
* When set to false or not set (default), hook failures will mark tests as "failed".
* @default false
*/
ignoreHooksStatus?: boolean
}
export interface BrowserstackOptions extends Options.Testrunner {
selfHeal?: boolean;
}
export interface BrowserstackConfig {
*`buildIdentifier` is a unique id to differentiate every execution that gets appended to
* buildName. Choose your buildIdentifier format from the available expressions:
* ${BUILD_NUMBER} (Default): Generates an incremental counter with every execution
* ${DATE_TIME}: Generates a Timestamp with every execution. Eg. 05-Nov-19:30
*/
buildIdentifier?: string;
* Set this to true to enable BrowserStack Test Observability which will collect test related data
* (name, hierarchy, status, error stack trace, file name and hierarchy), test commands, etc.
* and show all the data in a meaningful manner in BrowserStack Test Observability dashboards for faster test debugging and better insights.
* @default true
*/
testObservability?: boolean;
* Set the Test Observability related config options under this key.
* For e.g. buildName, projectName, BrowserStack access credentials, etc.
*/
testObservabilityOptions?: TestObservabilityOptions;
* Set this to true to enable BrowserStack Percy which will take screenshots
* and snapshots for your tests run on Browserstack
* @default false
*/
percy?: boolean;
* Accepts mode as a string to auto capture screenshots at different execution points
* Accepted values are auto, click, testcase, screenshot & manual
*/
percyCaptureMode?: string;
* Set the Percy related config options under this key.
*/
percyOptions?: {
version?: string,
};
* Set this to true to enable BrowserStack Accessibility Automation which will
* automically conduct accessibility testing on your pre-existing test builds
* and generate health reports which can be viewed in the Accessibility dashboard.
* @default false
*/
accessibility?: boolean;
* Customise the Accessibility-related config options under this key.
* For e.g. wcagVersion, bestPractice issues, needsReview issues etc.
*/
accessibilityOptions?: { [key: string]: unknown; };
* Set this with app file path present locally on your device or
* app hashed id returned after uploading app to BrowserStack or
* custom_id, sharable_id of the uploaded app
* @default undefined
*/
app?: string | AppConfig;
* Enable routing connections from BrowserStack cloud through your computer.
* You will also need to set `browserstack.local` to true in browser capabilities.
* @default false
*/
browserstackLocal?: boolean;
* Kill the BrowserStack Local process on complete, without waiting for the
* BrowserStack Local stop callback to be called.
*
* __This is experimental and should not be used by all.__
* @default false
*/
forcedStop?: boolean;
* BrowserStack Local options. For more details check out the
* [`browserstack-local`](https://www.npmjs.com/package/browserstack-local#arguments) docs.
*
* @example
* ```js
* {
* localIdentifier: 'some-identifier'
* }
* ```
* @default {}
*/
opts?: Partial<BSOptions>
* Cucumber only. Set the BrowserStack Automate session name to the Scenario name if only a single Scenario ran.
* Useful when running in parallel with [wdio-cucumber-parallel-execution](https://github.com/SimitTomar/wdio-cucumber-parallel-execution).
* @default false
*/
preferScenarioName?: boolean;
* Customize the BrowserStack Automate session name format.
* @default undefined
*/
sessionNameFormat?: (
config: Options.Testrunner,
capabilities: Capabilities.ResolvedTestrunnerCapabilities,
suiteTitle: string,
testTitle?: string
) => string
* Mocha only. Do not append the test title to the BrowserStack Automate session name.
* @default false
*/
sessionNameOmitTestTitle?: boolean;
* Mocha only. Prepend the top level suite title to the BrowserStack Automate session name.
* @default false
*/
sessionNamePrependTopLevelSuiteTitle?: boolean;
* Automatically set the BrowserStack Automate session name.
* @default true
*/
setSessionName?: boolean
* Automatically set the BrowserStack Automate session status (passed/failed).
* @default true
*/
setSessionStatus?: boolean
* Set this to true while running tests on the automation grid created using BrowserStack Automate TurboScale
* to automatically set the session name and status for quick debugging.
* @default false
*/
turboScale?: boolean;
selfHeal?: boolean;
}
* Observability types
*/
export interface PlatformMeta {
sessionId?: string,
browserName?: string,
browserVersion?: string,
platformName?: string,
caps?: WebdriverIO.Capabilities,
product?: string
}
export interface TestMeta {
uuid?: string,
startedAt?: string,
finishedAt?: string,
steps?: StepData[],
feature?: { name: string, path?: string, description: string | null },
scenario?: { name: string },
examples?: string[],
hookType?: string,
testRunId?: string
}
export interface CurrentRunInfo {
uuid?: string,
name?: string,
test?: Frameworks.Test,
finished?: boolean
}
export interface TestData {
uuid?: string,
type?: string,
name?: string,
scope?: string,
scopes?: string[],
identifier?: string,
file_name?: string,
vc_filepath?: string,
location?: string,
started_at?: string,
finished_at?: string,
framework?: string,
body?: TestCodeBody,
result?: string,
failure?: Failure[],
failure_reason?: string,
failure_type?: string | null,
retries?: { limit: number, attempts: number },
duration_in_ms?: number,
integrations?: { [index: string]: IntegrationObject },
hook_type?: string,
hooks?: string[],
meta?: TestMeta,
tags?: string[],
test_run_id?: string,
product_map?: {}
}
export interface UserConfig {
buildName?: string,
projectName?: string,
buildTag?: string,
bstackServiceVersion?: string,
buildIdentifier?: string,
accessibilityOptions?: { [key: string]: unknown; }
}
export interface UploadType {
event_type: string,
hook_run?: TestData,
test_run?: TestData|CBTData,
logs?: LogData[]
}
export interface LogData {
timestamp: string
kind: 'TEST_LOG'|'TEST_STEP'|'HTTP'|'TEST_SCREENSHOT'
test_run_uuid?: string
hook_run_uuid?: string
message?: string
level?: string
http_response?: unknown
}
export interface StdLog extends LogData {
kind: 'TEST_LOG'
}
export interface ScreenshotLog extends LogData {
kind: 'TEST_SCREENSHOT'
}
export interface LaunchResponse {
jwt: string,
build_hashed_id: string,
observability?: {
success: boolean;
options: {
allow_screenshots?: boolean;
},
errors?: {
key: string;
message: string;
}[];
},
accessibility?: {
success: boolean;
errors?: {
key: string;
message: string;
}[];
options: {
status: string;
commandsToWrap: {
scriptsToRun: string[];
commands: unknown[];
};
scripts: {
name: string;
command: string;
}[];
capabilities: {
name: string,
value: unknown
}[];
}
};
}
export interface UserConfigforReporting {
framework?: string,
services?: unknown[],
capabilities?: WebdriverIO.Capabilities,
env?: {
'BROWSERSTACK_BUILD': string | undefined,
'BROWSERSTACK_BUILD_NAME': string | undefined,
'BUILD_TAG': string | undefined,
}
}
export interface CredentialsForCrashReportUpload {
username?: string,
password?: string
}
export interface IntegrationObject {
capabilities?: WebdriverIO.Capabilities,
session_id?: string
browser?: string
browser_version?: string
platform?: string
product?: string
platform_version?: string
}
interface TestCodeBody {
lang: string,
code?: string | null
}
interface StepData {
id?: string,
text?: string,
keyword?: string,
started_at?: string,
finished_at?: string,
result?: string,
duration?: number,
failure?: string
}
interface Failure {
backtrace: string[]
}
export interface FeatureStatsOverview {
triggeredCount: number
sentCount: number
failedCount: number
}
export interface CBTData {
uuid: string
integrations: { [index: string]: IntegrationObject }
}
export interface TOUsageStats {
enabled: boolean
manuallySet: boolean
buildHashedId?: string
events?: unknown
}
export interface EventProperties {
sdkRunId: string
testhub_uuid?: string
language_framework: string
referrer: string
language: string
languageVersion: string
buildName: string
buildIdentifier: string
os: string
hostname: string
productMap: { [key: string]: boolean }
product: string[]
framework?: string
pollingTimeout?: string,
productUsage?: {
testObservability: {
events: {
buildEvents: {
finished: {
status: string
error?: string
stoppedFrom: string
}
}
}
}
}
}
export interface FunnelData {
userName?: string
accessKey?: string
event_type?: string,
detectedFramework?: string,
event_properties: EventProperties
}