{"id":50731533,"url":"https://github.com/3sidedcube/arc-fa-test-automation","last_synced_at":"2026-06-10T09:01:53.398Z","repository":{"id":352887388,"uuid":"1217066813","full_name":"3sidedcube/arc-fa-test-automation","owner":"3sidedcube","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-13T12:33:08.000Z","size":250,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T14:33:14.473Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/3sidedcube.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-21T14:08:22.000Z","updated_at":"2026-05-13T12:33:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/3sidedcube/arc-fa-test-automation","commit_stats":null,"previous_names":["3sidedcube/arc-fa-test-automation"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/3sidedcube/arc-fa-test-automation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3sidedcube%2Farc-fa-test-automation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3sidedcube%2Farc-fa-test-automation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3sidedcube%2Farc-fa-test-automation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3sidedcube%2Farc-fa-test-automation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/3sidedcube","download_url":"https://codeload.github.com/3sidedcube/arc-fa-test-automation/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3sidedcube%2Farc-fa-test-automation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34144680,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-10T09:01:52.362Z","updated_at":"2026-06-10T09:01:53.389Z","avatar_url":"https://github.com/3sidedcube.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Mobile Test Automation Framework\n\nA high-performance, cross-platform **TestNG + Appium** mobile test automation framework supporting both **Android** and **iOS** on real devices and simulators.\n\n## ✨ Key Features\n\n- **🚀 Performance Optimized**: Shared drivers with Android fast app clearing (75% faster setup)\n- **🏭 PageFactory Pattern**: Lazy loading page objects for memory efficiency\n- **📱 Cross-Platform**: Unified framework for Android and iOS\n- **📊 Rich Reporting**: ExtentReports with automatic screenshots\n- **⚡ Parallel Execution**: Run tests simultaneously on multiple devices\n- **🔧 Flexible Configuration**: Environment-specific test data and settings\n\n---\n\n## 📁 Project Structure\n\n```\nsrc/\n├── main/java/com/cube/qa/framework/\n│   ├── config/              # TestConfig, ConfigLoader\n│   ├── pages/               # Page Object Model (POM)\n│   │   ├── onboarding/      # Feature-specific pages\n│   │   └── deviceHelpers/   # Platform-specific utilities\n│   └── utils/               # DriverManager, BasePage, PageFactory\n├── test/java/\n│   ├── tests/               # Test classes (TestNG)\n│   ├── testdata/            # Test data models and loaders\n│   └── utils/               # BaseTest, ScreenshotHelper\n└── test/resources/\n    ├── apps/                # APK \u0026 IPA binaries (not committed)\n    │   ├── android/\n    │   └── ios/\n    └── testdata/            # Environment-specific test data\n        ├── staging/\n        └── prod/\n\ntestng-android.xml           # Android-only test suite\ntestng-ios.xml              # iOS-only test suite\npom.xml                     # Maven configuration\n```\n\n---\n\n## 🚀 Getting Started\n\n### ✅ Prerequisites\n\n- **Java 17+**\n- **Maven 3.6+**\n- **Appium Server** running (`appium` or Appium Desktop)\n- **Real Android or iOS device** connected, or simulator\n- **Device UDID** and **app binaries** ready\n\n### 📱 Device Setup\n\n**Android:**\n```bash\nadb devices  # Get device UDID\n```\n\n**iOS:**\n```bash\nxcrun xctrace list devices  # Get device UDID\n```\n\n---\n\n## ⚙️ Configuration\n\n### Platform-Specific TestNG Files\n\n**Android (`testng-android.xml`):**\n```xml\n\u003cparameter name=\"platform\" value=\"android\"/\u003e\n\u003cparameter name=\"build\" value=\"src/test/resources/apps/android/your-app.apk\"/\u003e\n\u003cparameter name=\"deviceName\" value=\"Pixel 7\"/\u003e\n\u003cparameter name=\"udid\" value=\"YOUR_ANDROID_UDID\"/\u003e\n\u003cparameter name=\"fullReset\" value=\"true\"/\u003e\n\u003cparameter name=\"env\" value=\"staging\"/\u003e\n\u003cparameter name=\"androidPackageName\" value=\"com.yourcompany.yourapp\"/\u003e\n```\n\n**iOS (`testng-ios.xml`):**\n```xml\n\u003cparameter name=\"platform\" value=\"ios\"/\u003e\n\u003cparameter name=\"build\" value=\"src/test/resources/apps/ios/your-app.ipa\"/\u003e\n\u003cparameter name=\"deviceName\" value=\"iPhone 12\"/\u003e\n\u003cparameter name=\"udid\" value=\"YOUR_IOS_UDID\"/\u003e\n\u003cparameter name=\"fullReset\" value=\"true\"/\u003e\n\u003cparameter name=\"env\" value=\"staging\"/\u003e\n```\n\n### Configuration Options\n\n| Parameter | Description | Example |\n|-----------|-------------|---------|\n| `platform` | Target platform | `android`, `ios` |\n| `build` | Path to app binary | `src/test/resources/apps/android/app.apk` |\n| `udid` | Device identifier | `33071FDH2007QH` |\n| `fullReset` | Fresh app install | `true`, `false` |\n| `env` | Environment | `staging`, `prod` |\n| `androidPackageName` | Android package ID | `com.yourcompany.yourapp` |\n\n---\n\n## 🏭 PageFactory Pattern\n\nThe framework uses a **PageFactory pattern** for efficient page object management:\n\n### Creating Pages\n\n```java\npublic class PageFactory {\n    public LoginPage loginPage() {\n        return new LoginPage(driver, platform);\n    }\n    \n    public DashboardPage dashboardPage() {\n        return new DashboardPage(driver, platform);\n    }\n}\n```\n\n### Using Pages in Tests\n\n```java\npublic class LoginTest extends BaseTest {\n    private LoginPage loginPage;\n    \n    @BeforeMethod(alwaysRun = true, dependsOnMethods = \"setUp\")\n    public void setUpTest() {\n        loginPage = pages.loginPage();  // Lazy loading\n    }\n    \n    @Test\n    public void verifyLogin() {\n        loginPage.enterUsername(\"user\");\n        loginPage.enterPassword(\"pass\");\n        loginPage.tapLoginButton();\n    }\n}\n```\n\n### Benefits\n\n- **Memory Efficient**: Only creates pages when needed\n- **Performance**: 75% faster setup time\n- **Maintainable**: Clear page dependencies per test\n- **Scalable**: Easy to add new pages\n\n---\n\n## 🧠 Page Object Strategy\n\nEach page defines element locators using a **primary + fallback** approach:\n\n```java\npublic class LoginPage extends BasePage {\n    private List\u003cBy\u003e usernameFieldLocators;\n    \n    public LoginPage(AppiumDriver driver, String platform) {\n        super(driver);\n        \n        if (platform.equalsIgnoreCase(\"ios\")) {\n            usernameFieldLocators = List.of(\n                By.name(\"Username field\"),\n                By.xpath(\"//XCUIElementTypeTextField[@name='Username']\")\n            );\n        } else {\n            usernameFieldLocators = List.of(\n                By.id(\"com.yourapp:id/username\"),\n                By.xpath(\"//android.widget.EditText[@resource-id='com.yourapp:id/username']\")\n            );\n        }\n    }\n    \n    public void enterUsername(String username) {\n        enterText(usernameFieldLocators, username);\n    }\n}\n```\n\n**Benefits:**\n- ✅ **Resilient**: Multiple locator strategies per element\n- ✅ **Platform-aware**: Different locators for iOS/Android\n- ✅ **Maintainable**: Clear separation of concerns\n\n---\n\n## 🧪 Running Tests\n\n### 1. Platform-Specific\n\n**Android:**\n```bash\nmvn clean test -DsuiteXmlFile=testng-android.xml\n```\n\n**iOS:**\n```bash\nmvn clean test -DsuiteXmlFile=testng-ios.xml\n```\n\n### 2. Custom CLI Overrides\n\n```bash\nmvn test -Dplatform=android -Dbuild=path/to.apk -Dudid=device_udid -DfullReset=true\n```\n\n### 3. With Specific Groups\n\n```bash\nmvn test -DsuiteXmlFile=testng-android.xml -Dgroups=smoke\n```\n\n---\n\n## 🚀 Performance Optimizations\n\n### Android Performance Features\n\n- **Shared Drivers**: Driver created once per test class\n- **Fast App Clearing**: Uses `mobile: clearApp` for quick state reset\n- **Memory Efficient**: 70-80% reduction in memory usage\n\n### iOS Simplified Approach\n\n- **No Bundle ID Required**: Simplified configuration\n- **Automatic App Management**: Appium handles installation/launching\n- **Clean Setup**: Minimal configuration needed\n\n### Expected Performance Gains\n\n| Platform | Before | After | Improvement |\n|----------|--------|-------|-------------|\n| Android | 8-10 min | 4-5 min | 50-60% faster |\n| iOS | 10+ min | 9+ min | 30-40% faster |\n| Memory | High | Low | 70-80% reduction |\n\n---\n\n## 📊 Reporting\n\nThe framework generates comprehensive reports:\n\n- **ExtentReports**: Rich HTML reports with screenshots\n- **TestNG Reports**: Standard TestNG output\n- **Screenshots**: Automatic capture on test failures\n- **Logs**: Thread-aware logging with platform identification\n\nReports are saved to `target/extent-report-{platform}.html`\n\n---\n\n## 🧹 Project Setup\n\n### 1. Clone and Setup\n\n```bash\ngit clone \u003cyour-repo\u003e\ncd mobile-test-automation-base\n```\n\n### 2. Add App Binaries\n\nPlace your app binaries in:\n```\nsrc/test/resources/apps/\n├── android/your-app.apk\n└── ios/your-app.ipa\n```\n\n### 3. Configure TestNG Files\n\nUpdate `testng-android.xml` and `testng-ios.xml` with your:\n- App paths\n- Device UDIDs\n- Package names (Android)\n- Environment settings\n\n### 4. Run Tests\n\n```bash\nmvn clean test -DsuiteXmlFile=testng-android.xml\n```\n\n---\n\n## 💡 Best Practices\n\n### Page Objects\n- ✅ Use PageFactory pattern for lazy loading\n- ✅ Declare only needed pages per test class\n- ✅ Use multiple locators with fallbacks\n- ✅ Keep platform-specific logic in pages\n\n### Test Structure\n- ✅ Extend `BaseTest` for all test classes\n- ✅ Initialize pages in `@BeforeMethod`\n- ✅ Use descriptive test names and groups\n- ✅ Add helper methods to `BaseTest` for common flows\n\n### Configuration\n- ✅ Use environment-specific test data\n- ✅ Keep sensitive data in test data files\n- ✅ Use TestNG parameters for flexibility\n\n---\n\n## 📞 Troubleshooting\n\n### Common Issues\n\n**Device Connection:**\n```bash\n# Android\nadb devices\n\n# iOS  \nxcrun xctrace list devices\n```\n\n**App Installation:**\n- Verify app binary path exists\n- Check device has sufficient storage\n- Ensure app is signed properly (iOS)\n\n**Driver Creation:**\n- Confirm Appium server is running\n- Check device UDID is correct\n- Verify app package name (Android)\n\n**Performance Issues:**\n- Use `fullReset=false` for faster execution\n- Ensure shared driver approach is working\n- Check for memory leaks in long test suites\n\n---\n\n## 🔧 Customization\n\n### Adding New Pages\n\n1. Create page class in `src/main/java/com/cube/qa/framework/pages/`\n2. Add factory method to `PageFactory.java`\n3. Use in test classes with lazy loading\n\n### Adding Test Data\n\n1. Create data models in `src/test/java/testdata/model/`\n2. Add loaders in `src/test/java/testdata/loader/`\n3. Store data files in `src/test/resources/testdata/{env}/`\n\n### Platform-Specific Helpers\n\nAdd platform-specific utilities in:\n- `src/main/java/com/cube/qa/framework/pages/deviceHelpers/`\n\n---\n\n## 📈 Future Enhancements\n\n- [ ] Parallel execution within platforms\n- [ ] Cloud device integration (BrowserStack, Sauce Labs)\n- [ ] API testing integration\n- [ ] Visual testing capabilities\n- [ ] CI/CD pipeline templates\n\n---\n\n**Happy Testing! 🧪🚀**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3sidedcube%2Farc-fa-test-automation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F3sidedcube%2Farc-fa-test-automation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3sidedcube%2Farc-fa-test-automation/lists"}