{"title":"اختبار تطبيقات iOS المؤتمت","slug":"automated-testing-ios","category":"guides","summary":"استخدم Synapse + Computer Control API لأتمتة اختبارات تطبيقات iOS عبر Simulator.","audience":["human","llm"],"tags":["guide","ios","testing","automation"],"difficulty":"advanced","updated":"2026-06-27","word_count":297,"read_minutes":1,"lang":"ar","translated":true,"requested_lang":"ar","content_markdown":"\n# اختبار تطبيقات iOS المؤتمت\n\nاجمع نظام ذاكرة Synapse مع Computer Control API لبناء\nاختبارات تطبيقات iOS مدفوعة بـ LLM. يتذكر الـ LLM سيناريوهات الاختبار، يتعلّم من الإخفاقات\nالسابقة، ويتكيّف مع تغييرات الواجهة.\n\n## البنية\n\n```\n┌──────────────┐    commands    ┌──────────────┐    screenshots    ┌──────────────┐\n│  LLM Agent   │ ─────────────▶│  Synapse     │ ────────────────▶ │  iOS Sim     │\n│  (Claude)    │               │  Computer    │ ◀──────────────── │  (via agent) │\n└──────────────┘               │  Control     │    results        └──────────────┘\n       │                       └──────────────┘\n       │ store/recall\n       ▼\n┌──────────────┐\n│  Memories    │ (test scenarios, past failures, UI patterns)\n└──────────────┘\n```\n\n## المتطلبات المسبقة\n\n- حساب Synapse + Mind Key\n- خادم Synapse MCP مُعدّ في Claude Desktop\n- iOS Simulator مع `screen-remote-agent` مثبت\n- جهاز مسجّل في Synapse (راجع [Computer Control API](/docs/api/computers))\n\n## الخطوة 1: سجّل جهاز Simulator\n\nعلى الـ Mac الذي يشغّل iOS Simulator:\n\n```bash\n# احصل على رمز التثبيت من Synapse\ncurl -X POST https://synapse.schaefer.zone/computers/install-code \\\n  -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n  -d '{\"computer_name\":\"ios-sim\"}'\n# → { \"install_code\": \"ic_...\" }\n\n# شغّل screen-remote-agent على الـ Mac\n# (يستخدم رمز التثبيت للتسجيل)\n```\n\n## الخطوة 2: خزّن سيناريوهات الاختبار في الذاكرة\n\nخزّن سيناريوهات اختبار قابلة لإعادة الاستخدام كذكريات:\n\n```python\nimport requests\n\ndef store_test_scenario(name, steps, app):\n    requests.post(f\"{URL}/memory\",\n        headers={\"Authorization\": f\"Bearer {MIND_KEY}\"},\n        json={\n            \"category\": \"skill\",\n            \"key\": f\"test_scenario_{name}\",\n            \"content\": f\"App: {app}\\nSteps:\\n\" + \"\\n\".join(steps),\n            \"tags\": [\"test\", \"ios\", app],\n            \"priority\": \"high\"\n        })\n\nstore_test_scenario(\"login_flow\", [\n    \"Launch app\",\n    \"Tap email field\",\n    \"Type test@example.com\",\n    \"Tap password field\",\n    \"Type password123\",\n    \"Tap Login button\",\n    \"Verify home screen appears\"\n], \"MyApp\")\n```\n\n## الخطوة 3: تنفيذ الاختبار المدفوع بـ LLM\n\nفي Claude Desktop (مع Synapse MCP مُعدًا):\n\n```\nRun the login_flow test scenario on the iOS Simulator.\nTake a screenshot after each step and verify the expected UI.\nIf any step fails, store the failure as a memory so we can\navoid it next time.\n```\n\nسيفعل Claude:\n\n1. يستدعي `memory_search` لإيجاد ذاكرة `test_scenario_login_flow`\n2. يستدعي `computer_screenshot` لرؤية الحالة الحالية\n3. ينفّذ كل خطوة عبر `computer_command_queue` (click، type)\n4. يتحقق من النتائج عبر لقطات الشاشة\n5. يخزّن أي إخفاقات كذكريات `mistake`\n\n## الخطوة 4: اختبارات ذاتية الإصلاح\n\nعند فشل اختبار، خزّن الفشل والتعافي:\n\n```python\ndef store_test_failure(scenario, step, error, recovery):\n    requests.post(f\"{URL}/memory\",\n        headers={\"Authorization\": f\"Bearer {MIND_KEY}\"},\n        json={\n            \"category\": \"mistake\",\n            \"key\": f\"failure_{scenario}_{step}\",\n            \"content\": f\"Scenario: {scenario}\\nStep: {step}\\nError: {error}\\nRecovery: {recovery}\",\n            \"tags\": [\"test\", \"failure\", \"ios\", scenario],\n            \"priority\": \"high\"\n        })\n\n# مثال\nstore_test_failure(\"login_flow\", \"tap_login\",\n    \"Login button not found at expected coordinates\",\n    \"Button moved due to new logo. Search by accessibility label instead.\")\n```\n\nفي المرة التالية التي يُشغّل فيها الـ LLM الاختبار، يستدعي الفشل ويطبّق\nالتعافي تلقائيًا.\n\n## الخطوة 5: تتبع نتائج الاختبار\n\nتتبع عمليات تشغيل الاختبار كمهام:\n\n```python\ndef track_test_run(scenario, status, duration):\n    requests.post(f\"{URL}/mind/task\",\n        headers={\"Authorization\": f\"Bearer {MIND_KEY}\",\n                 \"Content-Type\": \"application/json\"},\n        json={\n            \"title\": f\"Test: {scenario}\",\n            \"description\": f\"Status: {status}, Duration: {duration}s\",\n            \"priority\": \"normal\"\n        })\n```\n\n## الأوامر الشائعة\n\n| الإجراء | الأمر |\n|--------|---------|\n| تشغيل Simulator | `xcrun simctl launch booted com.example.app` |\n| لقطة شاشة | `computer_screenshot` (عبر Synapse MCP) |\n| النقر عند (x,y) | `computer_command_queue {type:\"click\", payload:{x,y}}` |\n| كتابة نص | `computer_command_queue {type:\"type\", payload:{text:\"...\"}}` |\n| ضغط Home | `computer_command_queue {type:\"key\", payload:{keys:[\"Cmd\",\"Shift\",\"H\"]}}` |\n\n## أفضل الممارسات\n\n> [!TIP]\n> - **خزّن إحداثيات الواجهة كذكريات** — تتغير الواجهة، لكن الـ LLM يستطيع إعادة التعلم\n> - **استخدم تسميات الوصول (accessibility labels)** — أكثر ثباتًا من الإحداثيات\n> - **خزّن بيانات الاختبار منفصلة** — استخدم متغيرات لأسماء المستخدمين، كلمات المرور\n> - **شغّل الاختبارات في حالة نظيفة** — أعد تعيين Simulator بين التشغيلات\n> - **سجّل لقطات شاشة للإخفاقات** — مفيد للتصحيح\n\n## الخطوات التالية\n\n- [اختبارات ذاتية الإصلاح](/docs/guides/self-healing-tests)\n- [Computer Control API](/docs/api/computers)\n- [أفضل ممارسات الذاكرة](/docs/guides/memory-best-practices)\n","content_html":"<h1>اختبار تطبيقات iOS المؤتمت</h1>\n<p>اجمع نظام ذاكرة Synapse مع Computer Control API لبناء\nاختبارات تطبيقات iOS مدفوعة بـ LLM. يتذكر الـ LLM سيناريوهات الاختبار، يتعلّم من الإخفاقات\nالسابقة، ويتكيّف مع تغييرات الواجهة.</p>\n<h2>البنية</h2>\n<pre><code class=\"hljs language-plaintext\">┌──────────────┐    commands    ┌──────────────┐    screenshots    ┌──────────────┐\n│  LLM Agent   │ ─────────────▶│  Synapse     │ ────────────────▶ │  iOS Sim     │\n│  (Claude)    │               │  Computer    │ ◀──────────────── │  (via agent) │\n└──────────────┘               │  Control     │    results        └──────────────┘\n       │                       └──────────────┘\n       │ store/recall\n       ▼\n┌──────────────┐\n│  Memories    │ (test scenarios, past failures, UI patterns)\n└──────────────┘</code></pre><h2>المتطلبات المسبقة</h2>\n<ul>\n<li>حساب Synapse + Mind Key</li>\n<li>خادم Synapse MCP مُعدّ في Claude Desktop</li>\n<li>iOS Simulator مع <code>screen-remote-agent</code> مثبت</li>\n<li>جهاز مسجّل في Synapse (راجع <a href=\"/docs/api/computers\">Computer Control API</a>)</li>\n</ul>\n<h2>الخطوة 1: سجّل جهاز Simulator</h2>\n<p>على الـ Mac الذي يشغّل iOS Simulator:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># احصل على رمز التثبيت من Synapse</span>\ncurl -X POST https://synapse.schaefer.zone/computers/install-code \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;computer_name&quot;:&quot;ios-sim&quot;}&#x27;</span>\n<span class=\"hljs-comment\"># → { &quot;install_code&quot;: &quot;ic_...&quot; }</span>\n\n<span class=\"hljs-comment\"># شغّل screen-remote-agent على الـ Mac</span>\n<span class=\"hljs-comment\"># (يستخدم رمز التثبيت للتسجيل)</span></code></pre><h2>الخطوة 2: خزّن سيناريوهات الاختبار في الذاكرة</h2>\n<p>خزّن سيناريوهات اختبار قابلة لإعادة الاستخدام كذكريات:</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import</span> requests\n\n<span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">store_test_scenario</span>(<span class=\"hljs-params\">name, steps, app</span>):\n    requests.post(<span class=\"hljs-string\">f&quot;<span class=\"hljs-subst\">{URL}</span>/memory&quot;</span>,\n        headers={<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{MIND_KEY}</span>&quot;</span>},\n        json={\n            <span class=\"hljs-string\">&quot;category&quot;</span>: <span class=\"hljs-string\">&quot;skill&quot;</span>,\n            <span class=\"hljs-string\">&quot;key&quot;</span>: <span class=\"hljs-string\">f&quot;test_scenario_<span class=\"hljs-subst\">{name}</span>&quot;</span>,\n            <span class=\"hljs-string\">&quot;content&quot;</span>: <span class=\"hljs-string\">f&quot;App: <span class=\"hljs-subst\">{app}</span>\\nSteps:\\n&quot;</span> + <span class=\"hljs-string\">&quot;\\n&quot;</span>.join(steps),\n            <span class=\"hljs-string\">&quot;tags&quot;</span>: [<span class=\"hljs-string\">&quot;test&quot;</span>, <span class=\"hljs-string\">&quot;ios&quot;</span>, app],\n            <span class=\"hljs-string\">&quot;priority&quot;</span>: <span class=\"hljs-string\">&quot;high&quot;</span>\n        })\n\nstore_test_scenario(<span class=\"hljs-string\">&quot;login_flow&quot;</span>, [\n    <span class=\"hljs-string\">&quot;Launch app&quot;</span>,\n    <span class=\"hljs-string\">&quot;Tap email field&quot;</span>,\n    <span class=\"hljs-string\">&quot;Type test@example.com&quot;</span>,\n    <span class=\"hljs-string\">&quot;Tap password field&quot;</span>,\n    <span class=\"hljs-string\">&quot;Type password123&quot;</span>,\n    <span class=\"hljs-string\">&quot;Tap Login button&quot;</span>,\n    <span class=\"hljs-string\">&quot;Verify home screen appears&quot;</span>\n], <span class=\"hljs-string\">&quot;MyApp&quot;</span>)</code></pre><h2>الخطوة 3: تنفيذ الاختبار المدفوع بـ LLM</h2>\n<p>في Claude Desktop (مع Synapse MCP مُعدًا):</p>\n<pre><code class=\"hljs language-plaintext\">Run the login_flow test scenario on the iOS Simulator.\nTake a screenshot after each step and verify the expected UI.\nIf any step fails, store the failure as a memory so we can\navoid it next time.</code></pre><p>سيفعل Claude:</p>\n<ol>\n<li>يستدعي <code>memory_search</code> لإيجاد ذاكرة <code>test_scenario_login_flow</code></li>\n<li>يستدعي <code>computer_screenshot</code> لرؤية الحالة الحالية</li>\n<li>ينفّذ كل خطوة عبر <code>computer_command_queue</code> (click، type)</li>\n<li>يتحقق من النتائج عبر لقطات الشاشة</li>\n<li>يخزّن أي إخفاقات كذكريات <code>mistake</code></li>\n</ol>\n<h2>الخطوة 4: اختبارات ذاتية الإصلاح</h2>\n<p>عند فشل اختبار، خزّن الفشل والتعافي:</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">store_test_failure</span>(<span class=\"hljs-params\">scenario, step, error, recovery</span>):\n    requests.post(<span class=\"hljs-string\">f&quot;<span class=\"hljs-subst\">{URL}</span>/memory&quot;</span>,\n        headers={<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{MIND_KEY}</span>&quot;</span>},\n        json={\n            <span class=\"hljs-string\">&quot;category&quot;</span>: <span class=\"hljs-string\">&quot;mistake&quot;</span>,\n            <span class=\"hljs-string\">&quot;key&quot;</span>: <span class=\"hljs-string\">f&quot;failure_<span class=\"hljs-subst\">{scenario}</span>_<span class=\"hljs-subst\">{step}</span>&quot;</span>,\n            <span class=\"hljs-string\">&quot;content&quot;</span>: <span class=\"hljs-string\">f&quot;Scenario: <span class=\"hljs-subst\">{scenario}</span>\\nStep: <span class=\"hljs-subst\">{step}</span>\\nError: <span class=\"hljs-subst\">{error}</span>\\nRecovery: <span class=\"hljs-subst\">{recovery}</span>&quot;</span>,\n            <span class=\"hljs-string\">&quot;tags&quot;</span>: [<span class=\"hljs-string\">&quot;test&quot;</span>, <span class=\"hljs-string\">&quot;failure&quot;</span>, <span class=\"hljs-string\">&quot;ios&quot;</span>, scenario],\n            <span class=\"hljs-string\">&quot;priority&quot;</span>: <span class=\"hljs-string\">&quot;high&quot;</span>\n        })\n\n<span class=\"hljs-comment\"># مثال</span>\nstore_test_failure(<span class=\"hljs-string\">&quot;login_flow&quot;</span>, <span class=\"hljs-string\">&quot;tap_login&quot;</span>,\n    <span class=\"hljs-string\">&quot;Login button not found at expected coordinates&quot;</span>,\n    <span class=\"hljs-string\">&quot;Button moved due to new logo. Search by accessibility label instead.&quot;</span>)</code></pre><p>في المرة التالية التي يُشغّل فيها الـ LLM الاختبار، يستدعي الفشل ويطبّق\nالتعافي تلقائيًا.</p>\n<h2>الخطوة 5: تتبع نتائج الاختبار</h2>\n<p>تتبع عمليات تشغيل الاختبار كمهام:</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">track_test_run</span>(<span class=\"hljs-params\">scenario, status, duration</span>):\n    requests.post(<span class=\"hljs-string\">f&quot;<span class=\"hljs-subst\">{URL}</span>/mind/task&quot;</span>,\n        headers={<span class=\"hljs-string\">&quot;Authorization&quot;</span>: <span class=\"hljs-string\">f&quot;Bearer <span class=\"hljs-subst\">{MIND_KEY}</span>&quot;</span>,\n                 <span class=\"hljs-string\">&quot;Content-Type&quot;</span>: <span class=\"hljs-string\">&quot;application/json&quot;</span>},\n        json={\n            <span class=\"hljs-string\">&quot;title&quot;</span>: <span class=\"hljs-string\">f&quot;Test: <span class=\"hljs-subst\">{scenario}</span>&quot;</span>,\n            <span class=\"hljs-string\">&quot;description&quot;</span>: <span class=\"hljs-string\">f&quot;Status: <span class=\"hljs-subst\">{status}</span>, Duration: <span class=\"hljs-subst\">{duration}</span>s&quot;</span>,\n            <span class=\"hljs-string\">&quot;priority&quot;</span>: <span class=\"hljs-string\">&quot;normal&quot;</span>\n        })</code></pre><h2>الأوامر الشائعة</h2>\n<table>\n<thead>\n<tr>\n<th>الإجراء</th>\n<th>الأمر</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>تشغيل Simulator</td>\n<td><code>xcrun simctl launch booted com.example.app</code></td>\n</tr>\n<tr>\n<td>لقطة شاشة</td>\n<td><code>computer_screenshot</code> (عبر Synapse MCP)</td>\n</tr>\n<tr>\n<td>النقر عند (x,y)</td>\n<td><code>computer_command_queue {type:&quot;click&quot;, payload:{x,y}}</code></td>\n</tr>\n<tr>\n<td>كتابة نص</td>\n<td><code>computer_command_queue {type:&quot;type&quot;, payload:{text:&quot;...&quot;}}</code></td>\n</tr>\n<tr>\n<td>ضغط Home</td>\n<td><code>computer_command_queue {type:&quot;key&quot;, payload:{keys:[&quot;Cmd&quot;,&quot;Shift&quot;,&quot;H&quot;]}}</code></td>\n</tr>\n</tbody></table>\n<h2>أفضل الممارسات</h2>\n<div class=\"callout callout-ok\"></div><h2>الخطوات التالية</h2>\n<ul>\n<li><a href=\"/docs/guides/self-healing-tests\">اختبارات ذاتية الإصلاح</a></li>\n<li><a href=\"/docs/api/computers\">Computer Control API</a></li>\n<li><a href=\"/docs/guides/memory-best-practices\">أفضل ممارسات الذاكرة</a></li>\n</ul>\n","urls":{"html":"/docs/guides/automated-testing-ios","text":"/docs/guides/automated-testing-ios?format=text","json":"/docs/guides/automated-testing-ios?format=json","llm":"/docs/guides/automated-testing-ios?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}