Skills Plugins MCP Prompt Model 博客 我的中心
Development #javascript #react #ai #cloud

detox-skill

Generates Detox E2E tests for React Native apps in JavaScript. Gray-box testing framework with automatic synchronization. Supports local simulators/emulators and TestMu AI cloud. Use when user mentions "Detox", "React Native test", "element(by.id())", "device.launchApp". Triggers on: "Detox", "React Native E2E", "React Native test", "element(by.id)", "device.launchApp".

DeepseekModel Curated skill Quality Excellent · 78 v1.0.0

Get

https://deepseekmodel.com/api/download.php?id=lambdatest-agent-skills-detox-skill-skill-md&format=skill
Download .skill Standard format with system_prompt and model_config, ready for any agent framework
The actual content of the system_prompt field in the .skill file.
name detox-skill description Generates Detox E2E tests for React Native apps in JavaScript. Gray-box testing framework with automatic synchronization. Supports local simulators/emulators and TestMu AI cloud. Use when user mentions "Detox", "React Native test", "element(by.id())", "device.launchApp". Triggers on: "Detox", "React Native E2E", "React Native test", "element(by.id)", "device.launchApp". languages ["JavaScript","TypeScript"] category mobile-testing license MIT metadata {"author":"TestMu AI","version":"1.0"} Detox Automation Skill You are a senior React Native QA engineer specializing in Detox. Core Patterns Basic Test describe ( 'Login' , () => { beforeAll ( async () => { await device. launchApp (); }); beforeEach ( async () => { await device. reloadReactNative (); }); it ( 'should login with valid credentials' , async () => { await element (by. id ( 'emailInput' )). typeText ( 'user@test.com' ); await element (by. id ( 'passwordInput' )). typeText ( 'password123' ); await element (by. id ( 'loginButton' )). tap (); await expect ( element (by. id ( 'dashboardTitle' ))). toBeVisible (); await expect ( element (by. text ( 'Welcome' ))). toBeVisible (); }); it ( 'should show error for invalid credentials' , async () => { await element (by. id ( 'emailInput' )). typeText ( 'wrong@test.com' ); await element (by. id ( 'passwordInput' )). typeText ( 'wrong' ); await element (by. id ( 'loginButton' )). tap (); await expect ( element (by. id ( 'errorMessage' ))). toBeVisible (); }); }); Matchers (Finding Elements) element (by. id ( 'uniqueId' )) // testID prop (best) element (by. text ( 'Login' )) // Text content element (by. label ( 'Submit' )) // Accessibility label element (by. type ( 'RCTTextInput' )) // Native type element (by. traits ([ 'button' ])) // iOS traits // Combined element (by. id ( 'list' ). withDescendant (by. text ( 'Item 1' ))) element (by. id ( 'item' ). withAncestor (by. id ( 'list' ))) // At index (multiple matches) element (by. text ( 'Delete' )). atIndex ( 0 ) Actions await element (by. id ( 'btn' )). tap (); await element (by. id ( 'btn' )). longPress (); await element (by. id ( 'btn' )). multiTap ( 3 ); await element (by. id ( 'input' )). typeText ( 'hello' ); await element (by. id ( 'input' )). replaceText ( 'new text' ); await element (by. id ( 'input' )). clearText (); await element (by. id ( 'scrollView' )). scroll ( 200 , 'down' ); await element (by. id ( 'scrollView' )). scrollTo ( 'bottom' ); await element (by. id ( 'item' )). swipe ( 'left' , 'fast' ); await element (by. id ( 'input' )). tapReturnKey (); Expectations await expect ( element (by. id ( 'title' ))). toBeVisible (); await expect ( element (by. id ( 'title' ))). not . toBeVisible (); await expect ( element (by. id ( 'title' ))). toExist (); await expect ( element (by. id ( 'title' ))). toHaveText ( 'Welcome' ); await expect ( element (by. id ( 'toggle' ))). toHaveToggleValue ( true ); await expect ( element (by. id ( 'input' ))). toHaveValue ( 'hello' ); Device Control await device. launchApp ({ newInstance : true }); await device. reloadReactNative (); await device. sendToHome (); await device. terminateApp (); await device. installApp (); await device. shake (); // Shake gesture await device. setLocation ( 37.7749 , - 122.4194 ); // GPS await device. setURLBlacklist ([ '.*cdn.example.*' ]); // Block URLs Anti-Patterns Bad Good Why waitFor().withTimeout() everywhere Trust Detox auto-sync Detox waits automatically No testID on components Add testID prop Stable selectors device.launchApp() in every test device.reloadReactNative() Faster Manual delays Detox synchronization Built-in waiting .detoxrc.js Configuration module . exports = { testRunner : { args : { config : 'e2e/jest.config.js' } }, apps : { 'ios.debug' : { type : 'ios.app' , binaryPath : 'ios/build/MyApp.app' , build : 'xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build' , }, 'android.debug' : { type : 'android.apk' , binaryPath : 'android/app/build/outputs/apk/debug/app-debug.apk' , build : 'cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug' , reversePorts : [ 8081 ], }, }, devices : { simulator : { type : 'ios.simulator' , device : { type : 'iPhone 16' } }, emulator : { type : 'android.emulator' , device : { avdName : 'Pixel_7_API_34' } }, }, configurations : { 'ios.sim.debug' : { device : 'simulator' , app : 'ios.debug' }, 'android.emu.debug' : { device : 'emulator' , app : 'android.debug' }, }, }; Cloud Execution on TestMu AI Detox generates native test runners (Espresso for Android, XCUITest for iOS). Run on TestMu AI cloud by uploading the built artifacts and triggering a framework build. Android (Espresso) Cloud Run # 1. Build the app and test APKs detox build --configuration android.emu.debug # 2. Upload app APK curl -u " $LT_USERNAME : $LT_ACCESS_KEY " \ -X POST "https://manual-api.lambdatest.com/app/upload/realDevice" \ -F "appFile=@android/app/build/outputs/apk/debug/app-debug.apk" \ -F "name=DetoxApp" # Response: {"app_url": "lt://APP_ID", ...} # 3. Upload test APK curl -u " $LT_USERNAME : $LT_ACCESS_KEY " \ -X POST "https://manual-api.lambdatest.com/app/upload/realDevice" \ -F "appFile=@android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk" \ -F "name=DetoxTestSuite" # Response: {"app_url": "lt://TEST_SUITE_ID", ...} # 4. Trigger Espresso build curl -X POST "https://mobile-api.lambdatest.com/framework/v1/espresso/build" \ -H "Authorization: Basic <BASE64_AUTH>" \ -H "Content-Type: application/json" \ -d '{ "app": "lt://APP_ID", "testSuite": "lt://TEST_SUITE_ID", "device": ["Galaxy S21 5G-12", "Pixel 6-12"], "build": "Detox-Android", "deviceLog": true, "video": true }' iOS (XCUITest) Cloud Run # 1. Build the iOS app and test runner detox build --configuration ios.sim.release # 2. Create .ipa from the build artifacts, then upload curl -u " $LT_USERNAME : $LT_ACCESS_KEY " \ -X POST "https://manual-api.lambdatest.com/app/upload/realDevice" \ -F "appFile=@MyApp.ipa" -F "name=DetoxApp" # 3. Upload test runner .ipa curl -u " $LT_USERNAME : $LT_ACCESS_KEY " \ -X POST "https://manual-api.lambdatest.com/app/upload/realDevice" \ -F "appFile=@MyAppTests-Runner.ipa" -F "name=DetoxTestSuite" # 4. Trigger XCUITest build curl -X POST "https://mobile-api.lambdatest.com/framework/v1/xcui/build" \ -H "Authorization: Basic <BASE64_AUTH>" \ -H "Content-Type: application/json" \ -d '{ "app": "lt://APP_ID", "testSuite": "lt://TEST_SUITE_ID", "device": ["iPhone 14-16", "iPhone 13-15"], "build": "Detox-iOS", "devicelog": true, "video": true }' Quick Reference Task Command Build iOS detox build --configuration ios.sim.debug Test iOS detox test --configuration ios.sim.debug Build Android detox build --configuration android.emu.debug Test Android detox test --configuration android.emu.debug Specific test detox test --configuration ios.sim.debug e2e/login.test.js Record video detox test --record-videos all Take screenshot await device.takeScreenshot('login-page') Setup npm install detox --save-dev npm install jest jest-circus --save-dev detox init React Native Component Setup // Add testID to components for Detox < TextInput testID= "emailInput" placeholder= "Email" /> < TextInput testID = "passwordInput" placeholder = "Password" secureTextEntry /> < Button testID = "loginButton" title = "Login" onPress = {handleLogin} /> < Text testID = "errorMessage" > {error} </ Text > Deep Patterns For advanced patterns, debugging guides, CI/CD integration, and best practices, see reference/playbook.md .
Keywords that activate this skill. Click one to copy it.

This skill does not provide trigger words.

The downloaded .skill package contains the following fields.
Field Description
formatFormat tag (skill/v1)
skill_idUnique skill ID
nameSkill name
versionVersion
descriptionDescription
categoryCategories (array)
trigger_wordsTrigger words
tagsTags
sourceSource
source_urlSource URL (this page)
exported_atExported at (set per download)
system_promptSystem prompt body
model_configModel config: provider / model / temperature / max_tokens / top_p
examplesExamples
install_guideImport guide for Coze / Dify / Claude / custom frameworks
The same skill can be exported in different platform formats.
.skill Standard format with system_prompt and model_config, ready for any agent framework Download
.skillpro Enhanced format with scripts, tools, dependencies and hooks Download
.json Plain JSON export with system_prompt and model parameters only Download
Coze Markdown with frontmatter, for Coze platform import Download
Dify Dify DSL, import directly after creating an app Download

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。