ES6/7 Node wrapper around Apple's simctl
binary, the "Command line utility to control the iOS Simulator". simctl
is run as a sub-command of xcrun
Install through npm.
npm install node-simctl
The module exports single class Simctl
. This class contains methods
which wrap the following simctl subcommands:
- createDevice
*
None
None
- deleteDevice
None
None
None
- eraseDevice
- bootDevice
- shutdownDevice
None
- getEnv
- openUrl
- addMedia
- installApp
- uninstallApp
- getAppContainer
- launchApp
- terminateApp
- spawnProcess
- spawnSubProcess
- getDevicesByParsing
*
- getDevices
*
- getRuntimeForPlatformVersionViaJson
*
- getRuntimeForPlatformVersion
*
- getDeviceTypes
*
- list
*
None
None
- setPasteboard
- getPasteboard
None
- getScreeenshot
None
None
None
- getAppearance
- setAppearance
- pushNotification
- grantPermission
- revokePermission
- resetPermission
- addRootCertificate
- addCertificate
- resetKeychain
- appInfo
- startBootMonitor
Methods marked with the star (*
) character do not require the udid
property to be set
on the Simctl
instance upon their invocation. All other methods will throw an error if the udid
property is unset while they are being invoked.
All public methods are supplied with docstrings that describe their arguments and returned values.
The Simctl
class constructor supports the following options:
xcrun
(Object): The xcrun properties. Currently only one property is supported, which ispath
and it by default containsnull
, which enforces the instance to automatically detect the full path toxcrun
tool and to throw an exception if it cannot be detected. If the path is set upon instance creation then it is going to be used byexec
and no autodetection will happen.execTimeout
(number[600000]): The maximum number of milliseconds to wait for a single synchronous xcrun command.logErrors
(boolean[true]): Whether to write xcrun error messages into the debug log before throwing them as errors.udid
(string[null]): The unique identifier of the current device, which is going to be implicitly passed to all methods, which require it (see above). It can either be set upon instance creation if it is already known or later when/if needed via the corresponding setter.devicesSetPath
(string[null]): Full path to the set of devices that you want to manage. By default this path usually equals to ~/Library/Developer/CoreSimulator/Devices. This option has a getter and a setter which allows to switch between multiple device sets during the Simctl instance life cycle.
Any simctl subcommand could be called via exec
method, which accepts the subcommand itself
as the first argument and the set of options, which may contain additional command args,
environment variables, encoding, etc. For example:
import Simctl from 'node-simctl';
const simctl = new Simctl();
const name = 'My Device Name';
simctl.udid = await simctl.createDevice(name, 'iPhone X', '13.3');
await simctl.bootDevice();
await simctl.startBootMonitor({timeout: 120000});
await simctl.exec('pbsync');
console.log(`Pasteboard content: ${await simctl.getPasteboard()}`);
const {stdout} = await simctl.exec('status_bar', {
args: [simctl.udid, 'list']
});
console.log(output);
simctl.udid = void(await simctl.deleteDevice());
See specs for examples of usage.
It is possible to run multiple simulators using different Xcode SDKs on a single machine.
Simply set a proper value to DEVELOPER_DIR
environment variable for each process.
Read this MacOps article for more details.