@react-native-windows/automation 0.81.4 → 0.81.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -42,7 +42,6 @@ const webdriverio = __importStar(require("webdriverio"));
|
|
|
42
42
|
const automation_channel_1 = require("@react-native-windows/automation-channel");
|
|
43
43
|
class AutomationEnvironment extends jest_environment_node_1.default {
|
|
44
44
|
constructor(config, context) {
|
|
45
|
-
var _a;
|
|
46
45
|
super(config, context);
|
|
47
46
|
const passedOptions = config.projectConfig.testEnvironmentOptions;
|
|
48
47
|
if (!passedOptions.app) {
|
|
@@ -103,7 +102,7 @@ class AutomationEnvironment extends jest_environment_node_1.default {
|
|
|
103
102
|
},
|
|
104
103
|
}, passedOptions.webdriverOptions);
|
|
105
104
|
}
|
|
106
|
-
this.webDriverOptions.capabilities = Object.assign(this.webDriverOptions.capabilities,
|
|
105
|
+
this.webDriverOptions.capabilities = Object.assign(this.webDriverOptions.capabilities, passedOptions.webdriverOptions?.capabilities);
|
|
107
106
|
this.channelOptions = {
|
|
108
107
|
enable: passedOptions.enableAutomationChannel === true,
|
|
109
108
|
port: passedOptions.automationChannelPort || 8603,
|
|
@@ -163,7 +162,6 @@ class AutomationEnvironment extends jest_environment_node_1.default {
|
|
|
163
162
|
this.global.$$ = this.browser.$$.bind(this.browser);
|
|
164
163
|
}
|
|
165
164
|
async teardown() {
|
|
166
|
-
var _a;
|
|
167
165
|
if (this.automationClient) {
|
|
168
166
|
this.automationClient.close();
|
|
169
167
|
}
|
|
@@ -174,7 +172,7 @@ class AutomationEnvironment extends jest_environment_node_1.default {
|
|
|
174
172
|
}
|
|
175
173
|
await this.browser.deleteSession();
|
|
176
174
|
}
|
|
177
|
-
|
|
175
|
+
this.winAppDriverProcess?.kill('SIGINT');
|
|
178
176
|
await super.teardown();
|
|
179
177
|
}
|
|
180
178
|
}
|
|
@@ -227,7 +225,7 @@ function resolveAppName(appName) {
|
|
|
227
225
|
}
|
|
228
226
|
return `${packageFamilyName}!App`;
|
|
229
227
|
}
|
|
230
|
-
catch
|
|
228
|
+
catch {
|
|
231
229
|
throw new Error(`Could not locate a package with identity "${appName}"`);
|
|
232
230
|
}
|
|
233
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutomationEnvironment.js","sourceRoot":"","sources":["../src/AutomationEnvironment.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport chalk from 'chalk';\nimport {spawnSync, spawn, ChildProcess} from 'child_process';\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport readlineSync from 'readline-sync';\n\nimport NodeEnvironment from 'jest-environment-node';\nimport * as webdriverio from 'webdriverio';\nimport {BrowserObject, RemoteOptions} from 'webdriverio';\nimport {JestEnvironmentConfig} from '@jest/environment';\nimport type {EnvironmentContext} from '@jest/environment';\nimport {\n waitForConnection,\n AutomationClient,\n} from '@react-native-windows/automation-channel';\n\nexport type EnvironmentOptions = {\n /**\n * The application to launch. Can be a path to an exe, or a package identity\n * name (e.g. Microsoft.WindowsAlarms)\n */\n app?: string;\n\n /**\n * Instead of letting WinAppDriver launch and attach to the app directly,\n * create a Root (Desktop) session and search for the app's window.\n *\n * Note: This is only really necessary to correctly attach to packaged\n * WinAppSDK apps.\n */\n useRootSession?: boolean;\n\n /**\n * When using a Root (Desktop) session, still launch the test app during setup\n * and close it during cleanup.\n *\n * Defaults to true when using `useRootSession` to mimic the expected test\n * behavior, but can be disabled if you're trying to test an already\n * running app instance.\n */\n rootLaunchApp?: boolean;\n\n /**\n * Arguments to be passed to your application when launched\n */\n appArguments?: string;\n\n appWorkingDir?: string;\n\n enableAutomationChannel?: boolean;\n automationChannelPort?: number;\n winAppDriverBin?: string;\n breakOnStart?: boolean;\n webdriverOptions?: RemoteOptions;\n};\n\ntype AutomationChannelOptions = {\n enable: boolean;\n port: number;\n};\n\nexport default class AutomationEnvironment extends NodeEnvironment {\n private readonly rootWebDriverOptions?: RemoteOptions;\n private readonly webDriverOptions: RemoteOptions;\n private readonly channelOptions: AutomationChannelOptions;\n private readonly winappdriverBin: string;\n private readonly breakOnStart: boolean;\n private readonly useRootSession: boolean;\n private readonly rootLaunchApp: boolean;\n private winAppDriverProcess: ChildProcess | undefined;\n private browser: BrowserObject | undefined;\n private automationClient: AutomationClient | undefined;\n\n constructor(config: JestEnvironmentConfig, context: EnvironmentContext) {\n super(config, context);\n const passedOptions: EnvironmentOptions =\n config.projectConfig.testEnvironmentOptions;\n\n if (!passedOptions.app) {\n throw new Error('\"app\" must be specified in testEnvironmentOptions');\n }\n\n this.winappdriverBin =\n passedOptions.winAppDriverBin ||\n path.join(\n process.env['PROGRAMFILES(X86)']!,\n 'Windows Application Driver\\\\WinAppDriver.exe',\n );\n\n if (!fs.existsSync(this.winappdriverBin)) {\n throw new Error(\n `Could not find WinAppDriver at searched location: \"${this.winappdriverBin}\"`,\n );\n }\n\n const baseOptions: RemoteOptions = {\n hostname: '127.0.0.1',\n port: 4723,\n\n // Level of logging verbosity: trace | debug | info | warn | error\n logLevel: 'error',\n\n // Default timeout for all waitFor* commands.\n waitforTimeout: 30000,\n\n // Default timeout in milliseconds for request\n connectionRetryTimeout: 30000,\n\n // Default request retries count\n connectionRetryCount: 5,\n };\n\n this.useRootSession = !!passedOptions.useRootSession;\n this.rootLaunchApp =\n passedOptions.rootLaunchApp === undefined\n ? this.useRootSession\n : !!passedOptions.rootLaunchApp;\n\n if (this.useRootSession) {\n this.rootWebDriverOptions = Object.assign(\n {},\n baseOptions,\n {\n capabilities: {\n app: 'Root',\n // @ts-ignore\n 'ms:experimental-webdriver': true,\n },\n },\n passedOptions.webdriverOptions,\n );\n\n this.webDriverOptions = Object.assign(\n {},\n baseOptions,\n {\n capabilities: {\n // Save the name for now, we'll get the handle later\n appTopLevelWindow: passedOptions.app,\n // @ts-ignore\n 'ms:experimental-webdriver': true,\n },\n },\n passedOptions.webdriverOptions,\n );\n } else {\n this.webDriverOptions = Object.assign(\n {},\n baseOptions,\n {\n capabilities: {\n app: resolveAppName(passedOptions.app),\n ...(passedOptions.appWorkingDir && {\n appWorkingDir: passedOptions.appWorkingDir,\n }),\n ...(passedOptions.appArguments && {\n appArguments: passedOptions.appArguments,\n }),\n\n // @ts-ignore\n 'ms:experimental-webdriver': true,\n },\n },\n passedOptions.webdriverOptions,\n );\n }\n\n this.webDriverOptions.capabilities = Object.assign(\n this.webDriverOptions.capabilities!,\n passedOptions.webdriverOptions?.capabilities,\n );\n\n this.channelOptions = {\n enable: passedOptions.enableAutomationChannel === true,\n port: passedOptions.automationChannelPort || 8603,\n };\n\n this.breakOnStart = passedOptions.breakOnStart === true;\n }\n\n async setup() {\n await super.setup();\n this.winAppDriverProcess = await spawnWinAppDriver(\n this.winappdriverBin,\n this.webDriverOptions.port!,\n );\n\n if (this.useRootSession) {\n // Extract out the saved window name\n const appName = (this.webDriverOptions.capabilities! as any)\n .appTopLevelWindow;\n\n if (this.rootLaunchApp) {\n const appPackageName = resolveAppName(appName);\n spawnSync('cmd', [\n '/c',\n 'start',\n `shell:AppsFolder\\\\${appPackageName}`,\n ]);\n }\n\n // Set up the \"Desktop\" or Root session\n const rootBrowser = await webdriverio.remote(this.rootWebDriverOptions);\n\n // Get the list of windows\n const allWindows = await rootBrowser.$$('//Window');\n\n // Find our target window\n let appWindow: webdriverio.Element | undefined;\n for (const window of allWindows) {\n if ((await window.getAttribute('Name')) === appName) {\n appWindow = window;\n break;\n }\n }\n\n if (!appWindow) {\n throw new Error(`Unable to find window with Name === '${appName}'.`);\n }\n\n // Swap the the window handle for WinAppDriver\n const appWindowHandle = parseInt(\n await appWindow!.getAttribute('NativeWindowHandle'),\n 10,\n );\n\n (this.webDriverOptions.capabilities as any).appTopLevelWindow =\n '0x' + appWindowHandle.toString(16);\n\n await rootBrowser.deleteSession();\n }\n\n this.browser = await webdriverio.remote(this.webDriverOptions);\n\n if (this.breakOnStart) {\n readlineSync.question(\n chalk.bold.yellow('Breaking before tests start\\n') +\n 'Press Enter to resume...',\n );\n }\n\n if (this.channelOptions.enable) {\n this.automationClient = await waitForConnection({\n port: this.channelOptions.port,\n });\n this.global.automationClient = this.automationClient;\n }\n\n this.global.remote = webdriverio.remote;\n this.global.browser = this.browser;\n this.global.$ = this.browser.$.bind(this.browser);\n this.global.$$ = this.browser.$$.bind(this.browser);\n }\n\n async teardown() {\n if (this.automationClient) {\n this.automationClient.close();\n }\n\n if (this.browser) {\n if (this.rootLaunchApp) {\n // We started the app, so let's close it too\n await this.browser.closeWindow();\n }\n await this.browser.deleteSession();\n }\n this.winAppDriverProcess?.kill('SIGINT');\n await super.teardown();\n }\n}\n\n/**\n * Starts a WinAppdriver process and resolves a promise with the process once\n * it is ready to accept commands\n *\n * Inspired-by/stolen from https://github.com/licanhua/wdio-winappdriver-service\n */\nasync function spawnWinAppDriver(\n winappdriverBin: string,\n port: number,\n): Promise<ChildProcess> {\n if (!fs.existsSync(winappdriverBin)) {\n throw new Error(\n `Could not locate WinAppDriver binary at \"${winappdriverBin}\"`,\n );\n }\n\n return new Promise((resolve, reject) => {\n const process = spawn(winappdriverBin, [port.toString()], {stdio: 'pipe'});\n\n process.stdout.on('data', data => {\n const s = data.toString('utf16le');\n if (s.includes('Press ENTER to exit.')) {\n resolve(process);\n } else if (s.includes('Failed to initialize')) {\n reject(new Error('Failed to start WinAppDriver: ' + s));\n }\n });\n\n process.stderr.once('data', err => {\n console.warn(err);\n });\n\n process.once('exit', exitCode => {\n reject(\n new Error(\n `WinAppDriver CLI exited before timeout (exit code: ${exitCode})`,\n ),\n );\n });\n });\n}\n\n/**\n * Convert a package identity or path to exe to the form expected by a WinAppDriver capability\n */\nfunction resolveAppName(appName: string): string {\n if (appName.endsWith('.exe')) {\n return appName;\n }\n\n try {\n const packageFamilyName = spawnSync('powershell', [\n `(Get-AppxPackage -Name ${appName}).PackageFamilyName`,\n ])\n .stdout.toString()\n .trim();\n\n if (packageFamilyName.length === 0) {\n // Rethrown below\n throw new Error();\n }\n\n return `${packageFamilyName}!App`;\n } catch {\n throw new Error(`Could not locate a package with identity \"${appName}\"`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AutomationEnvironment.js","sourceRoot":"","sources":["../src/AutomationEnvironment.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport chalk from 'chalk';\nimport {spawnSync, spawn, ChildProcess} from 'child_process';\nimport fs from '@react-native-windows/fs';\nimport path from 'path';\nimport readlineSync from 'readline-sync';\n\nimport NodeEnvironment from 'jest-environment-node';\nimport * as webdriverio from 'webdriverio';\nimport {BrowserObject, RemoteOptions} from 'webdriverio';\nimport {JestEnvironmentConfig} from '@jest/environment';\nimport type {EnvironmentContext} from '@jest/environment';\nimport {\n waitForConnection,\n AutomationClient,\n} from '@react-native-windows/automation-channel';\n\nexport type EnvironmentOptions = {\n /**\n * The application to launch. Can be a path to an exe, or a package identity\n * name (e.g. Microsoft.WindowsAlarms)\n */\n app?: string;\n\n /**\n * Instead of letting WinAppDriver launch and attach to the app directly,\n * create a Root (Desktop) session and search for the app's window.\n *\n * Note: This is only really necessary to correctly attach to packaged\n * WinAppSDK apps.\n */\n useRootSession?: boolean;\n\n /**\n * When using a Root (Desktop) session, still launch the test app during setup\n * and close it during cleanup.\n *\n * Defaults to true when using `useRootSession` to mimic the expected test\n * behavior, but can be disabled if you're trying to test an already\n * running app instance.\n */\n rootLaunchApp?: boolean;\n\n /**\n * Arguments to be passed to your application when launched\n */\n appArguments?: string;\n\n appWorkingDir?: string;\n\n enableAutomationChannel?: boolean;\n automationChannelPort?: number;\n winAppDriverBin?: string;\n breakOnStart?: boolean;\n webdriverOptions?: RemoteOptions;\n};\n\ntype AutomationChannelOptions = {\n enable: boolean;\n port: number;\n};\n\nexport default class AutomationEnvironment extends NodeEnvironment {\n private readonly rootWebDriverOptions?: RemoteOptions;\n private readonly webDriverOptions: RemoteOptions;\n private readonly channelOptions: AutomationChannelOptions;\n private readonly winappdriverBin: string;\n private readonly breakOnStart: boolean;\n private readonly useRootSession: boolean;\n private readonly rootLaunchApp: boolean;\n private winAppDriverProcess: ChildProcess | undefined;\n private browser: BrowserObject | undefined;\n private automationClient: AutomationClient | undefined;\n\n constructor(config: JestEnvironmentConfig, context: EnvironmentContext) {\n super(config, context);\n const passedOptions: EnvironmentOptions =\n config.projectConfig.testEnvironmentOptions;\n\n if (!passedOptions.app) {\n throw new Error('\"app\" must be specified in testEnvironmentOptions');\n }\n\n this.winappdriverBin =\n passedOptions.winAppDriverBin ||\n path.join(\n process.env['PROGRAMFILES(X86)']!,\n 'Windows Application Driver\\\\WinAppDriver.exe',\n );\n\n if (!fs.existsSync(this.winappdriverBin)) {\n throw new Error(\n `Could not find WinAppDriver at searched location: \"${this.winappdriverBin}\"`,\n );\n }\n\n const baseOptions: RemoteOptions = {\n hostname: '127.0.0.1',\n port: 4723,\n\n // Level of logging verbosity: trace | debug | info | warn | error\n logLevel: 'error',\n\n // Default timeout for all waitFor* commands.\n waitforTimeout: 30000,\n\n // Default timeout in milliseconds for request\n connectionRetryTimeout: 30000,\n\n // Default request retries count\n connectionRetryCount: 5,\n };\n\n this.useRootSession = !!passedOptions.useRootSession;\n this.rootLaunchApp =\n passedOptions.rootLaunchApp === undefined\n ? this.useRootSession\n : !!passedOptions.rootLaunchApp;\n\n if (this.useRootSession) {\n this.rootWebDriverOptions = Object.assign(\n {},\n baseOptions,\n {\n capabilities: {\n app: 'Root',\n // @ts-ignore\n 'ms:experimental-webdriver': true,\n },\n },\n passedOptions.webdriverOptions,\n );\n\n this.webDriverOptions = Object.assign(\n {},\n baseOptions,\n {\n capabilities: {\n // Save the name for now, we'll get the handle later\n appTopLevelWindow: passedOptions.app,\n // @ts-ignore\n 'ms:experimental-webdriver': true,\n },\n },\n passedOptions.webdriverOptions,\n );\n } else {\n this.webDriverOptions = Object.assign(\n {},\n baseOptions,\n {\n capabilities: {\n app: resolveAppName(passedOptions.app),\n ...(passedOptions.appWorkingDir && {\n appWorkingDir: passedOptions.appWorkingDir,\n }),\n ...(passedOptions.appArguments && {\n appArguments: passedOptions.appArguments,\n }),\n\n // @ts-ignore\n 'ms:experimental-webdriver': true,\n },\n },\n passedOptions.webdriverOptions,\n );\n }\n\n this.webDriverOptions.capabilities = Object.assign(\n this.webDriverOptions.capabilities!,\n passedOptions.webdriverOptions?.capabilities,\n );\n\n this.channelOptions = {\n enable: passedOptions.enableAutomationChannel === true,\n port: passedOptions.automationChannelPort || 8603,\n };\n\n this.breakOnStart = passedOptions.breakOnStart === true;\n }\n\n async setup() {\n await super.setup();\n this.winAppDriverProcess = await spawnWinAppDriver(\n this.winappdriverBin,\n this.webDriverOptions.port!,\n );\n\n if (this.useRootSession) {\n // Extract out the saved window name\n const appName = (this.webDriverOptions.capabilities! as any)\n .appTopLevelWindow;\n\n if (this.rootLaunchApp) {\n const appPackageName = resolveAppName(appName);\n spawnSync('cmd', [\n '/c',\n 'start',\n `shell:AppsFolder\\\\${appPackageName}`,\n ]);\n }\n\n // Set up the \"Desktop\" or Root session\n const rootBrowser = await webdriverio.remote(this.rootWebDriverOptions);\n\n // Get the list of windows\n const allWindows = await rootBrowser.$$('//Window');\n\n // Find our target window\n let appWindow: webdriverio.Element | undefined;\n for (const window of allWindows) {\n if ((await window.getAttribute('Name')) === appName) {\n appWindow = window;\n break;\n }\n }\n\n if (!appWindow) {\n throw new Error(`Unable to find window with Name === '${appName}'.`);\n }\n\n // Swap the the window handle for WinAppDriver\n const appWindowHandle = parseInt(\n await appWindow!.getAttribute('NativeWindowHandle'),\n 10,\n );\n\n (this.webDriverOptions.capabilities as any).appTopLevelWindow =\n '0x' + appWindowHandle.toString(16);\n\n await rootBrowser.deleteSession();\n }\n\n this.browser = await webdriverio.remote(this.webDriverOptions);\n\n if (this.breakOnStart) {\n readlineSync.question(\n chalk.bold.yellow('Breaking before tests start\\n') +\n 'Press Enter to resume...',\n );\n }\n\n if (this.channelOptions.enable) {\n this.automationClient = await waitForConnection({\n port: this.channelOptions.port,\n });\n this.global.automationClient = this.automationClient;\n }\n\n this.global.remote = webdriverio.remote;\n this.global.browser = this.browser;\n this.global.$ = this.browser.$.bind(this.browser);\n this.global.$$ = this.browser.$$.bind(this.browser);\n }\n\n async teardown() {\n if (this.automationClient) {\n this.automationClient.close();\n }\n\n if (this.browser) {\n if (this.rootLaunchApp) {\n // We started the app, so let's close it too\n await this.browser.closeWindow();\n }\n await this.browser.deleteSession();\n }\n this.winAppDriverProcess?.kill('SIGINT');\n await super.teardown();\n }\n}\n\n/**\n * Starts a WinAppdriver process and resolves a promise with the process once\n * it is ready to accept commands\n *\n * Inspired-by/stolen from https://github.com/licanhua/wdio-winappdriver-service\n */\nasync function spawnWinAppDriver(\n winappdriverBin: string,\n port: number,\n): Promise<ChildProcess> {\n if (!fs.existsSync(winappdriverBin)) {\n throw new Error(\n `Could not locate WinAppDriver binary at \"${winappdriverBin}\"`,\n );\n }\n\n return new Promise((resolve, reject) => {\n const process = spawn(winappdriverBin, [port.toString()], {stdio: 'pipe'});\n\n process.stdout.on('data', data => {\n const s = data.toString('utf16le');\n if (s.includes('Press ENTER to exit.')) {\n resolve(process);\n } else if (s.includes('Failed to initialize')) {\n reject(new Error('Failed to start WinAppDriver: ' + s));\n }\n });\n\n process.stderr.once('data', err => {\n console.warn(err);\n });\n\n process.once('exit', exitCode => {\n reject(\n new Error(\n `WinAppDriver CLI exited before timeout (exit code: ${exitCode})`,\n ),\n );\n });\n });\n}\n\n/**\n * Convert a package identity or path to exe to the form expected by a WinAppDriver capability\n */\nfunction resolveAppName(appName: string): string {\n if (appName.endsWith('.exe')) {\n return appName;\n }\n\n try {\n const packageFamilyName = spawnSync('powershell', [\n `(Get-AppxPackage -Name ${appName}).PackageFamilyName`,\n ])\n .stdout.toString()\n .trim();\n\n if (packageFamilyName.length === 0) {\n // Rethrown below\n throw new Error();\n }\n\n return `${packageFamilyName}!App`;\n } catch {\n throw new Error(`Could not locate a package with identity \"${appName}\"`);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-native-windows/automation",
|
|
3
|
-
"version": "0.81.
|
|
3
|
+
"version": "0.81.6",
|
|
4
4
|
"description": "UI Automation Suite for React Native Windows Applications",
|
|
5
5
|
"main": "lib-commonjs/index.js",
|
|
6
6
|
"repository": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"watch": "rnw-scripts watch"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@react-native-windows/automation-channel": "0.81.
|
|
20
|
+
"@react-native-windows/automation-channel": "0.81.6",
|
|
21
21
|
"@react-native-windows/fs": "0.81.0",
|
|
22
22
|
"@typescript-eslint/eslint-plugin": "^7.1.1",
|
|
23
23
|
"@typescript-eslint/parser": "^7.1.1",
|