appium-xcuitest-driver
Version:
Appium driver for iOS using XCUITest for backend
141 lines (118 loc) • 4.3 kB
text/typescript
import {resolveExecutablePath} from './utils';
import {doctor} from 'appium/support';
import type {IDoctorCheck, AppiumLogger, DoctorCheckResult} from '@appium/types';
import '@colors/colors';
import {exec} from 'teen_process';
export class OptionalSimulatorCheck implements IDoctorCheck {
log!: AppiumLogger;
static readonly SUPPORTED_SIMULATOR_PLATFORMS: SimulatorPlatform[] = [
{
displayName: 'iOS',
name: 'iphonesimulator'
},
{
displayName: 'tvOS',
name: 'appletvsimulator'
}
];
async diagnose(): Promise<DoctorCheckResult> {
try {
// https://github.com/appium/appium/issues/12093#issuecomment-459358120
await exec('xcrun', ['simctl', 'help']);
} catch (err) {
return doctor.nokOptional(
`Testing on Simulator is not possible. Cannot run 'xcrun simctl': ${(err as any).stderr || (err as Error).message}`
);
}
const sdks = await this._listInstalledSdks();
for (const {displayName, name} of OptionalSimulatorCheck.SUPPORTED_SIMULATOR_PLATFORMS) {
const errorPrefix = `Testing on ${displayName} Simulator is not possible`;
if (!sdks.some(({platform}) => platform === name)) {
return doctor.nokOptional(`${errorPrefix}: SDK is not installed`);
}
}
return doctor.okOptional(
`The following Simulator SDKs are installed:\n` +
sdks
.filter(({platform}) => OptionalSimulatorCheck.SUPPORTED_SIMULATOR_PLATFORMS.some(({name}) => name === platform))
.map(({displayName}) => `\t→ ${displayName}`).join('\n')
);
}
async fix(): Promise<string> {
return `Install the desired Simulator SDK from Xcode's Settings -> Components`;
}
hasAutofix(): boolean {
return false;
}
isOptional(): boolean {
return true;
}
private async _listInstalledSdks(): Promise<InstalledSdk[]> {
const {stdout} = await exec('xcodebuild', ['-json', '-showsdks']);
return JSON.parse(stdout);
}
}
export const optionalSimulatorCheck = new OptionalSimulatorCheck();
export class OptionalApplesimutilsCommandCheck implements IDoctorCheck {
log!: AppiumLogger;
static readonly README_LINK = 'https://github.com/appium/appium-xcuitest-driver/blob/master/docs/reference/execute-methods.md#mobile-setpermission';
async diagnose(): Promise<DoctorCheckResult> {
const applesimutilsPath = await resolveExecutablePath('applesimutils');
return applesimutilsPath
? doctor.okOptional(`applesimutils is installed at: ${applesimutilsPath}`)
: doctor.nokOptional('applesimutils are not installed');
}
async fix(): Promise<string> {
return `Why ${'applesimutils'.bold} is needed and how to install it: ${OptionalApplesimutilsCommandCheck.README_LINK}`;
}
hasAutofix(): boolean {
return false;
}
isOptional(): boolean {
return true;
}
}
export const optionalApplesimutilsCheck = new OptionalApplesimutilsCommandCheck();
export class OptionalFfmpegCheck implements IDoctorCheck {
log!: AppiumLogger;
static readonly FFMPEG_BINARY = 'ffmpeg';
static readonly FFMPEG_INSTALL_LINK = 'https://www.ffmpeg.org/download.html';
async diagnose(): Promise<DoctorCheckResult> {
const ffmpegPath = await resolveExecutablePath(OptionalFfmpegCheck.FFMPEG_BINARY);
return ffmpegPath
? doctor.okOptional(`${OptionalFfmpegCheck.FFMPEG_BINARY} exists at '${ffmpegPath}'`)
: doctor.nokOptional(`${OptionalFfmpegCheck.FFMPEG_BINARY} cannot be found`);
}
async fix(): Promise<string> {
return (
`${`${OptionalFfmpegCheck.FFMPEG_BINARY}`.bold} is used to capture screen recordings from the device under test. ` +
`Please read ${OptionalFfmpegCheck.FFMPEG_INSTALL_LINK}.`
);
}
hasAutofix(): boolean {
return false;
}
isOptional(): boolean {
return true;
}
}
export const optionalFfmpegCheck = new OptionalFfmpegCheck();
interface SimulatorPlatform {
displayName: string;
name: string;
}
interface InstalledSdk {
buildID?: string;
canonicalName: string;
displayName: string;
isBaseSdk: boolean;
platform: string;
platformPath: string;
platformVersion: string;
productBuildVersion?: string;
productCopyright?: string;
productName?: string;
productVersion?: string;
sdkPath: string;
sdkVersion: string;
}