UNPKG

screenkitten

Version:

A cross-platform Node.js library for taking screenshots on iOS simulators and Android devices/emulators

219 lines (161 loc) 5.83 kB
# Screenkitten 📱📸 A cross-platform Node.js library for taking screenshots on iOS simulators and Android devices/emulators. ## Features - 🍎 **iOS Simulator Support** - Take screenshots using `xcrun simctl` - 🤖 **Android Device/Emulator Support** - Take screenshots using `adb` - 🔄 **Cross-platform** - Unified API for both platforms - 📁 **Flexible Output** - Save to custom paths or auto-generate temp files - ⚡ **AbortController Support** - Cancel operations gracefully - 🎯 **TypeScript** - Full type safety and IntelliSense - 🔧 **Configurable** - Extensive options for both platforms - 🚨 **Rich Error Handling** - Detailed error types with proper inheritance ## Installation ```bash npm install screenkitten ``` ## Quick Start ### iOS Simulator ```typescript import { screenkitten } from 'screenkitten'; const ios = screenkitten({ platform: 'ios', deviceId: 'booted', // Default: 'booted' type: 'png', // Default: 'png' outputPath: '/path/to/screenshot.png' // Optional: auto-generated if not provided }); const screenshotPath = await ios.takeScreenshot(); console.log(`Screenshot saved to: ${screenshotPath}`); ``` ### Android Device/Emulator ```typescript import { screenkitten } from 'screenkitten'; const android = screenkitten({ platform: 'android', deviceId: 'emulator-5554', // Optional: uses 'booted' by default outputPath: '/path/to/screenshot.png' // Optional: auto-generated if not provided }); const screenshotPath = await android.takeScreenshot(); console.log(`Screenshot saved to: ${screenshotPath}`); ``` ## API Reference ### Factory Function #### `screenkitten(options: ScreenkittenOptions)` Creates a platform-specific screenshot instance. **Parameters:** - `options` - Configuration object (see platform-specific options below) **Returns:** `ScreenkittenIOS` or `ScreenkittenAndroid` instance ### iOS Options ```typescript interface ScreenkittenOptionsIOS { platform: 'ios'; deviceId?: string; // Default: 'booted' xcrunPath?: string; // Default: '/usr/bin/xcrun' type?: 'png' | 'jpeg'; // Default: 'png' display?: 'internal' | 'external'; // Default: 'internal' mask?: 'ignored' | 'alpha' | 'black'; // Default: 'ignored' outputPath?: string; // Auto-generated if not provided abortSignal?: AbortSignal; onError?: OnErrorHandler; } ``` ### Android Options ```typescript interface ScreenkittenOptionsAndroid { platform: 'android'; deviceId?: string; // Default: 'booted' adbPath?: string; // Default: 'adb' outputPath?: string; // Auto-generated if not provided abortSignal?: AbortSignal; onError?: OnErrorHandler; } ``` ### Error Handling You can control error behavior using the `onError` option: ```typescript type OnErrorHandler = 'throw' | 'ignore' | ((error: Error) => void); ``` **Options:** - `'throw'` (default) - Throws the error - `'ignore'` - Suppresses the error and returns the output path - `function` - Custom error handler function ```typescript // Custom error handling const ios = screenkitten({ platform: 'ios', onError: (error) => { console.error('Screenshot failed:', error.message); // Custom logging, reporting, etc. } }); ``` ### Instance Methods #### `takeScreenshot(options?: Partial<ScreenkittenOptionsBase>): Promise<string>` Takes a screenshot and returns the path to the saved file. **Parameters:** - `options` - Optional override options for this specific screenshot **Returns:** Promise that resolves to the screenshot file path **Example:** ```typescript // Use instance defaults const path1 = await ios.takeScreenshot(); // Override specific options for this screenshot const path2 = await ios.takeScreenshot({ outputPath: '/custom/path.png', deviceId: 'specific-device' }); ``` ### Abort Controller Support Cancel screenshot operations gracefully: ```typescript const controller = new AbortController(); const ios = screenkitten({ platform: 'ios', abortSignal: controller.signal }); // Cancel after 5 seconds setTimeout(() => controller.abort(), 5000); try { const path = await ios.takeScreenshot(); console.log('Screenshot saved:', path); } catch (error) { if (error.name === 'ScreenkittenOperationAbortedError') { console.log('Screenshot was cancelled'); } } ``` ## Error Types Screenkitten provides specific error types for different failure scenarios: ```typescript import { ScreenkittenError, // Base error class ScreenkittenDeviceNotFoundError, // Device/simulator not found ScreenkittenXcrunNotFoundError, // xcrun tool not found (iOS) ScreenkittenAdbNotFoundError, // adb tool not found (Android) ScreenkittenIOSSimulatorError, // iOS simulator not available ScreenkittenAndroidDeviceError, // Android device not available ScreenkittenFileWriteError, // Failed to write screenshot file ScreenkittenOperationAbortedError, // Operation was aborted ScreenkittenScreenshotFailedError, // Generic screenshot failure ScreenkittenInvalidTypeError // Invalid screenshot type (iOS) } from 'screenkitten'; ``` All errors extend the base `ScreenkittenError` class, which extends the standard `Error` class. ## Requirements ### iOS - macOS with Xcode and iOS Simulator - `xcrun` tool (usually available at `/usr/bin/xcrun`) ### Android - Android SDK with `adb` tool - Android device connected or emulator running ## CommonJS Support Screenkitten supports both ES modules and CommonJS: ```javascript // ES modules import { screenkitten } from 'screenkitten'; // CommonJS const { screenkitten } = require('screenkitten'); ``` ## License MIT ## Contributing Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md).