Capture d'écran
Capturez des screenshots App Store directement depuis les simulateurs iOS/iPadOS via des tests UI. Remplace fastlane snapshot.
Démarrage rapide
ascelerate screenshot init # Create config and helper in ascelerate/
ascelerate screenshot # Capture screenshots
Commandes
Exécuter
ascelerate screenshot # Capture screenshots
ascelerate screenshot run # Same as above
Utilise toujours ascelerate/screenshot.yml dans le répertoire courant.
Initialiser
ascelerate screenshot init
Crée ascelerate/screenshot.yml et ascelerate/ScreenshotHelper.swift dans le répertoire ascelerate/. Demande confirmation avant l'écriture. Ne remplace pas les fichiers existants.
Créer le helper
ascelerate screenshot create-helper # Generates ScreenshotHelper.swift
ascelerate screenshot create-helper -o CustomHelper.swift
Encadrement
ascelerate screenshot frame # Frame screenshots with device bezels
Encadre les captures d'écran avec des contours d'appareil. Utilise les paramètres frameDevice et deviceBezel de la configuration. Peut être exécuté indépendamment après la capture.
Diagnostic
ascelerate screenshot doctor # Check config and environment
Vérifie la configuration et l'environnement : fichier de configuration, existence du projet/workspace, disponibilité de xcodebuild et simctl, simulateurs, version du fichier helper, fichiers de contour d'appareil et répertoires de sortie. Affiche une liste de contrôle avec des indicateurs de réussite/échec/avertissement.
Configuration (ascelerate/screenshot.yml)
workspace: MyApp.xcworkspace
# project: MyApp.xcodeproj # Use project instead of workspace
scheme: AppUITests
devices:
- simulator: iPhone 17 Pro Max
# frameDevice: true
# deviceBezel: ./bezels/iPhone 17 Pro Max.png
- simulator: iPad Pro 13-inch (M5)
# frameDevice: true
# deviceBezel: ./bezels/iPad Pro 13-inch (M5).png
languages:
- en-US
- de-DE
outputDirectory: ./screenshots
# framedOutputDirectory: ./screenshots/framed
clearPreviousScreenshots: true
eraseSimulator: false
localizeSimulator: true
overrideStatusBar: true
darkMode: false
disableAnimations: true
waitAfterBoot: 0
# waitAfterEraseAndReboot: 30 # Attente supplémentaire pour les alertes système de premier lancement (ex. Apple Intelligence)
# statusBarArguments: "--time '9:41' --dataNetwork wifi"
# testWithoutBuilding: true # Skip build, use existing xctestrun
# cleanBuild: false
# headless: false # Don't open Simulator.app
# helperPath: AppUITests/ScreenshotHelper.swift
# launchArguments:
# - -ui_testing
# configuration: Debug # Build configuration
# testplan: MyTestPlan # Xcode test plan name
# numberOfRetries: 0 # Retry failed languages (erase + reboot simulator)
# stopAfterFirstError: false # Stop all devices on first failure
# reinstallApp: false # Delete and reinstall app before tests
# xcargs: SWIFT_ACTIVE_COMPILATION_CONDITIONS=SCREENSHOTS
Utilisation dans les UITests
Ajoutez ScreenshotHelper.swift à votre cible UITest :
override func setUp() {
setupScreenshots(app)
app.launch()
}
func testScreenshots() {
screenshot("01-home")
app.buttons["Settings"].tap()
screenshot("02-settings")
}
Votre application peut détecter le mode screenshot :
if ProcessInfo.processInfo.arguments.contains("-ASC_SCREENSHOT") {
// Show demo data, hide debug UI, etc.
}
Le helper fournit également disableAnimationsIfNeeded() pour désactiver les animations lorsque disableAnimations est activé dans la configuration :
override func setUp() {
setupScreenshots(app)
disableAnimationsIfNeeded()
app.launch()
}
Fonctionnement
- Build unique avec
build-for-testing(ou ignoré sitestWithoutBuilding: true) - Pour chaque langue : démarre tous les simulateurs, localise, remplace la barre d'état
- Exécute les tests en parallèle sur tous les appareils
- Si
numberOfRetriesest défini et qu'un appareil échoue : réinitialise les simulateurs en échec, re-localise, redémarre et relance les tests - Collecte les screenshots du cache par appareil vers le répertoire de sortie
- Encadre les captures d'écran avec des contours d'appareil (si
frameDeviceest activé) - Les erreurs sont ignorées et le processus continue — les logs d'erreur sont enregistrés dans la sortie
Sortie
screenshots/
├── en-US/
│ ├── iPhone 17 Pro Max-01-home.png
│ ├── iPhone 17 Pro Max-02-settings.png
│ └── iPad Pro 13-inch (M5)-01-home.png
└── de-DE/
└── ...
Encadrement d'appareil
Encadrez les captures d'écran avec les contours d'appareils Apple.
Les contours d'appareils ne sont pas inclus avec ascelerate — téléchargez-les depuis Apple Product Bezels (compte Apple Developer requis). Le téléchargement est un fichier DMG contenant les contours PNG pour tous les appareils actuels.
Configuration
- Téléchargez le DMG Product Bezels depuis Apple Design Resources
- Extrayez les fichiers PNG de contour dans un dossier de votre projet (ex.
./bezels/) - Activez l'encadrement par appareil dans la configuration :
devices:
- simulator: iPhone 17 Pro Max
frameDevice: true
deviceBezel: ./bezels/iPhone 17 Pro Max.png
- simulator: iPad Pro 13-inch (M5)
frameDevice: false
Sortie
Les captures d'écran encadrées sont enregistrées dans framedOutputDirectory (par défaut : {outputDirectory}/framed) :
screenshots/framed/
├── en-US/
│ └── iPhone 17 Pro Max-01-home.png
└── de-DE/
└── ...
Seuls les appareils avec frameDevice: true sont encadrés. L'encadrement s'exécute automatiquement après chaque langue pendant screenshot run, ou de manière autonome via screenshot frame.
Options
| Option | Description |
|---|---|
clearPreviousScreenshots | Vider le dossier de langue avant la collecte (uniquement si tous les appareils réussissent) |
eraseSimulator | Réinitialiser le simulateur avant chaque langue |
localizeSimulator | Définir la langue/locale du simulateur par langue |
overrideStatusBar | Remplacer la barre d'état (9:41, barres pleines, Wi-Fi) |
statusBarArguments | Arguments personnalisés pour xcrun simctl status_bar |
darkMode | Activer le mode sombre sur les simulateurs |
disableAnimations | Désactiver les animations pendant les tests |
waitAfterBoot | Secondes d'attente après le démarrage du simulateur (défaut : 0) |
waitAfterEraseAndReboot | Secondes d'attente supplémentaires lorsque le simulateur est dans un état neuf — première langue de l'exécution, ou chaque fois que le simulateur a été effacé (via eraseSimulator: true ou un nouvel essai). Donne aux alertes système de premier lancement (par exemple "Apple Intelligence est prêt") le temps d'apparaître avant les captures d'écran. |
testWithoutBuilding | Ignorer le build, utiliser le fichier xctestrun existant |
cleanBuild | Exécuter clean avant le build |
headless | Ne pas ouvrir Simulator.app |
helperPath | Chemin vers ScreenshotHelper.swift pour la vérification de version |
launchArguments | Arguments de lancement supplémentaires passés à l'application |
configuration | Configuration de build (ex. Debug, Release) |
testplan | Nom du plan de test Xcode |
numberOfRetries | Nombre de tentatives pour les langues échouées — réinitialise le simulateur, re-localise, redémarre et relance les tests. Seuls les appareils en échec sont relancés. Les résultats relancés sont marqués dans le tableau récapitulatif. |
stopAfterFirstError | Arrêter tous les appareils après le premier échec |
reinstallApp | Supprimer et réinstaller l'application avant les tests |
xcargs | Arguments supplémentaires passés à xcodebuild |
frameDevice | Activer l'encadrement pour cet appareil (par appareil) |
deviceBezel | Chemin vers le fichier PNG de contour d'appareil (par appareil) |
framedOutputDirectory | Répertoire de sortie pour les captures encadrées (défaut : {outputDirectory}/framed) |