{"id":33075600,"url":"https://github.com/WasiqB/coteafs-appium","last_synced_at":"2025-11-23T22:01:01.868Z","repository":{"id":45033433,"uuid":"88191647","full_name":"WasiqB/coteafs-appium","owner":"WasiqB","description":":iphone: Wrapper Appium Framework in Java which supports Automation of Mobile and Tablet apps.","archived":false,"fork":false,"pushed_at":"2022-08-17T16:11:45.000Z","size":127782,"stargazers_count":147,"open_issues_count":5,"forks_count":45,"subscribers_count":26,"default_branch":"master","last_synced_at":"2025-08-03T19:44:28.058Z","etag":null,"topics":["android","appium","appium-android","appium-framework","appium-ios","appium-java","appium-tests","automation","automation-framework","automation-test","framework","hacktoberfest","ios","java","test-automation","testing"],"latest_commit_sha":null,"homepage":"https://wasiqb.github.io/website/projects/coteafs-appium","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WasiqB.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null},"funding":{"github":"WasiqB"}},"created_at":"2017-04-13T17:50:59.000Z","updated_at":"2025-07-05T11:02:13.000Z","dependencies_parsed_at":"2022-08-15T03:30:24.095Z","dependency_job_id":null,"html_url":"https://github.com/WasiqB/coteafs-appium","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/WasiqB/coteafs-appium","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WasiqB%2Fcoteafs-appium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WasiqB%2Fcoteafs-appium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WasiqB%2Fcoteafs-appium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WasiqB%2Fcoteafs-appium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WasiqB","download_url":"https://codeload.github.com/WasiqB/coteafs-appium/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WasiqB%2Fcoteafs-appium/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286028547,"owners_count":27273410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-23T02:00:06.149Z","response_time":135,"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":["android","appium","appium-android","appium-framework","appium-ios","appium-java","appium-tests","automation","automation-framework","automation-test","framework","hacktoberfest","ios","java","test-automation","testing"],"created_at":"2025-11-14T10:00:37.868Z","updated_at":"2025-11-23T22:01:01.852Z","avatar_url":"https://github.com/WasiqB.png","language":"Java","funding_links":["https://github.com/sponsors/WasiqB"],"categories":["Test Frameworks"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://wasiqb.github.io/projects/appium\"\u003e\n    \u003cimg src=\"assets/coteafs-appium-logo.png\" width=300 padding=10 /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eWrapper Appium Framework in Java which supports Automation of Mobile and Tablet apps.\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/WasiqB/coteafs-appium)\n\n[![Open Source Love](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)][home]\n[![Discord](https://img.shields.io/discord/771674310687326208?label=Discord\u0026logo=Discord\u0026style=for-the-badge)][discord]\n[![CircleCI](https://circleci.com/gh/WasiqB/coteafs-appium.svg?style=svg)][circleci]\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=bugs)](https://sonarcloud.io/project/issues?id=com.github.wasiqb.coteafs%3Aappium\u0026resolved=false)\n[![Test Coverage](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=coverage)](https://sonarcloud.io/component_measures?id=com.github.wasiqb.coteafs%3Aappium\u0026metric=Coverage)\n[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=com.github.wasiqb.coteafs%3Aappium)\n[![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=sqale_rating)](https://sonarcloud.io/component_measures?id=com.github.wasiqb.coteafs%3Aappium\u0026metric=Maintainability)\n[![Reliability](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=reliability_rating)](https://sonarcloud.io/component_measures?id=com.github.wasiqb.coteafs%3Aappium\u0026metric=Reliability)\n[![Security](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=security_rating)](https://sonarcloud.io/component_measures?id=com.github.wasiqb.coteafs%3Aappium\u0026metric=Security)\n[![Vulnurability](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=vulnerabilities)](https://sonarcloud.io/component_measures?id=com.github.wasiqb.coteafs%3Aappium\u0026metric=new_vulnerabilities)\n[![Duplicate Code](https://sonarcloud.io/api/project_badges/measure?project=com.github.wasiqb.coteafs%3Aappium\u0026metric=duplicated_lines_density)](https://sonarcloud.io/component_measures?id=com.github.wasiqb.coteafs%3Aappium\u0026metric=Duplications)\n[![Maven Central](https://img.shields.io/maven-central/v/com.github.wasiqb.coteafs/appium.svg)][maven]\n[![Github Releases](https://img.shields.io/github/downloads/WasiqB/coteafs-appium/total.svg)](https://github.com/WasiqB/coteafs-appium/releases)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n\u003c/div\u003e\n\n## :video_camera: Demo\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/android-test.gif\" width=700 padding=10 style=\"border: 2px, border-color: black\" /\u003e\n\u003c/p\u003e\n\n## :rocket: [Quick Start][wiki]\n\n* The [documentations][wiki] of coteafs-appium includes all the information you need to get started including setup,\n  usage, advantages, sample test.\n* Want to know when our next feature or fix release is going to happen? Watch out our planned [milestones][].\n\n## :pushpin: [Want to know Key Features?][intro-doc]\n\nIn order to use a framework, it's important to know it's advantages. Let's see what are the key features of this\nframework:\n\n:point_right: :iphone: Supports Android and iOS Real Devices and Emulators.\n\n:point_right: :computer: Able to start and stop the server on run-time and also can connect to an already running\nserver.\n\n:point_right: :notebook: Enforces Page object model style of coding.\n\n:point_right: :milky_way: Allows parallel and sequential execution of tests.\n\n:point_right: :hammer: All capabilities, playback and delay settings are configurable through config file.\n\n:point_right: :cloud: Supports execution of tests on any Cloud solution like BrowserStack, SauceLabs, TestingBot, etc.\n\n:point_right: :video_camera: Supports video recording of tests on Android and iOS.\n\n:point_right: :camera: Supports capturing screenshots for Android and iOS.\n\n:point_right: :clipboard: Supports reading Clipboard from devices.\n\n:point_right: :notebook_with_decorative_cover: Supports logging of all events occurred during test execution.\n\n:point_right: :x: Provides pre-defined errors which wraps the Appium exceptions in a meaningful way.\n\n:point_right: :white_check_mark: Provides inbuilt assertions to verify the device elements.\n\n:point_right: :hotsprings: Supports any Testing frameworks like TestNG, JUnit or Cucumber.\n\n## :pushpin: Usage?\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.wasiqb.coteafs\u003c/groupId\u003e\n    \u003cartifactId\u003eappium\u003c/artifactId\u003e\n    \u003cversion\u003e4.2.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## :smile: How it is easy to write Tests with this Framework?\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003e1. :factory: \u003ca href=\"https://wasiqb.github.io/projects/appium/config-basics/\"\u003eHow to configure the tests?\u003c/a\u003e\u003c/strong\u003e\u003c/summary\u003e\n  \u003cbr/\u003e\n\nFirst step in writing tests using coteafs-appium framework is defining a Yaml config file in the `src/test/resources`\nfolder.\n\n**(_For more details, check the link above._)**\n\nSample file is shown below.\n\n```yaml\nservers:\n  android_server:\n    host: 127.0.0.1\n    port: 4723\n    external: true\n    logs:\n      level: DEBUG\n      path: logs/appium-server.log\n      timestamp: true\n      local_timezone: true\n      debug_spacing: true\n    android:\n      suppress_adb_kill: true\ndevices:\n  android:\n    os: ANDROID\n    name: Google Pixel 3\n    version: 8.1\n    type: SIMULATOR\n    others:\n      clear_files: true\n      no_reset: false\n      full_reset: true\n      clear_logs: true\n    automation: UIAUTOMATOR2\n    android:\n      avd:\n        name: Pixel_3_XL_API_27\n        launch_timeout: 60000\n        ready_timeout: 60000\n        args: -gpu swiftshader_indirect\n      app:\n        install_timeout: 60000\n        type: HYBRID\n        path: apps/android/VodQA.apk\n    session_timeout: 120000\n    playback:\n      screenshot:\n        on_error: true\n      recording:\n        enabled: true\n      stream:\n        enabled: true\n      delay:\n        before_swipe: 200\n        after_swipe: 100\n        before_tap: 0\n        after_tap: 0\n        implicit: 1\n        explicit: 20\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003e2. :dart: \u003ca href=\"https://wasiqb.github.io/projects/appium/sample-test-class/\"\u003eHow simple it is to write the tests?\u003c/a\u003e\u003c/strong\u003e\u003c/summary\u003e\n  \u003cbr/\u003e\n\nBy using Action classes for each Activity, the flow specific for that activity can be modularized and tests looks much\nclean and readable. See the sample test below.\n\n```java\nimport org.testng.annotations.AfterClass;\nimport org.testng.annotations.AfterMethod;\nimport org.testng.annotations.BeforeClass;\nimport org.testng.annotations.BeforeMethod;\n\nimport com.github.wasiqb.coteafs.appium.android.vodqa.actions.LoginActivityAction;\nimport com.github.wasiqb.coteafs.appium.service.AppiumServer;\n\npublic class SampleTest {\n    protected AndroidDevice androidDevice;\n    private   AppiumServer  androidServer;\n\n    @BeforeClass\n    public void setupTestSuite () {\n        // Here the parameter refers to the key in server block in config file.\n        this.androidServer = new AppiumServer (\"android_server\");\n        this.androidServer.start ();\n\n        // Here the param refers to the key in devices block in config file.\n        this.androidDevice = new AndroidDevice (this.androidServer, \"android_device\");\n        this.androidDevice.start ();\n        this.androidDevice.startRecording ();\n        this.androidDevice.startStreaming ();\n    }\n\n    @AfterClass (alwaysRun = true)\n    public void tearDownTestSuite () {\n        this.androidDevice.stopStreaming ();\n        this.androidDevice.stopRecording ();\n        this.androidDevice.stop ();\n        this.androidServer.stop ();\n    }\n\n    @Test\n    public void login () {\n        final LoginActivityAction login = new LoginActivityAction (this.androidDevice);\n        login.addInputValue (\"UserName\", \"admin\")\n            .addInputValue (\"Password\", \"admin\")\n            .perform ();\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003e3. :golf: \u003ca href=\"https://wasiqb.github.io/projects/appium/activity-class/\"\u003eHow to create Activity class?\u003c/a\u003e\u003c/strong\u003e\u003c/summary\u003e\n  \u003cbr/\u003e\n\nNew class needs to be created for each Activity. There's an abstract activity class for each type of device.\nHere `prepare` method needs to be implemented with all the elements available on that Activity.\n\nSee the below sample for an Android activity with comments for better understanding.\n\n```java\nimport org.openqa.selenium.By;\n\nimport com.github.wasiqb.coteafs.appium.android.AndroidDevice;\nimport com.github.wasiqb.coteafs.appium.device.DeviceElement;\n\npublic class LoginActivity extends AndroidActivity {\n    public LoginActivity (final AndroidDevice device) {\n        super (device);\n    }\n\n    @Override\n    protected DeviceElement prepare () {\n        final DeviceElement main = DeviceElement.create (\"Main\")\n            .forAndroid (By.id (\"android:id/content\"));\n        DeviceElement.create (\"Back\")\n            .parent (main)\n            .forAndroid (By.xpath (\"//android.widget.TextView[@text=\\\"Back\\\"]\"))\n            // We can set multiple locators for different Automation names.\n            .forAndroid (AutomationType.UIAUTOMATOR2,\n                MobileBy.AndroidUIAutomator (\"new UiSelector ().text (\\\"Back\\\");\"));\n        DeviceElement.create (\"UserName\")\n            .forAndroid (MobileBy.AccessibilityId (\"username\"))\n            .parent (main);\n        DeviceElement.create (\"Password\")\n            .forAndroid (MobileBy.AccessibilityId (\"password\"))\n            .parent (main);\n        DeviceElement.create (\"Login\")\n            .index (1)    // Index of element when multiple elements for same locator exists.\n            .waitStrategy (WaitStrategy.VISIBLE)  // Wait strategy to be used while finding the element.\n            .forAndroid (MobileBy.AccessibilityId (\"login\"))     // Locator used to find the element.\n            .parent (main);    // Parent of current element.\n        return main;\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003e4. :soccer: \u003ca href=\"https://wasiqb.github.io/projects/appium/action-class/\"\u003eHow to create your Activity action class?\u003c/a\u003e\u003c/strong\u003e\u003c/summary\u003e\n  \u003cbr/\u003e\n\nThere is abstract action class provided by the framework where Activity specific flow is implemented in perform method.\nSee the sample Activity action class below.\n\n```java\nimport com.github.wasiqb.coteafs.appium.android.AndroidActivityActions;\nimport com.github.wasiqb.coteafs.appium.android.AndroidDevice;\nimport com.github.wasiqb.coteafs.appium.android.vodqa.activities.LoginActivity;\n\npublic class LoginActivityAction extends AndroidActivityActions {\n    public LoginActivityAction (final AndroidDevice device) {\n        super (device);\n    }\n\n    @Override\n    public void perform () {\n        final LoginActivity login = new LoginActivity (getDevice ());\n        login.onElement (\"UserName\")\n            .enterText (value (\"UserName\"));\n        login.onElement (\"Password\")\n            .enterText (value (\"Password\"));\n        login.onDevice ()\n            .hideKeyboard ();\n        login.onElement (\"Login\")\n            .tap ();\n    }\n}\n```\n\n\u003c/details\u003e\n\n## :question: What to do when you need help?\n\n- You can chat with us on our [Discord server][discord].\n- Directly chat with me on my [site][] and I'll revert to you as soon as possible.\n- If you find any issue which is a bottleneck for you, [search the issue tracker][issues] to see if it is already\n  raised.\n- If not raised, then you can create a [new issue][] with required details as mentioned in the issue template.\n\n## :star: What you do if you like the project?\n\n- **Star** the project to make the project popular.\n- Stay updated with the project progress by **Watching** it.\n- Contribute to fix open issues, documentations or add new features. Check our [contributing][] page.\n\n## :heavy_check_mark: Contributors\n\n\u003cdiv\u003e\n  \u003cul\u003e\n    \u003cli\u003e\n      \u003ca href=\"https://github.com/WasiqB\"\u003e\n        \u003cimg alt=\"Wasiq Bhamla: Framework developer and maintainer.\" src=\"https://github.com/WasiqB.png\" width=100 height=100 /\u003e\n      \u003c/a\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"https://github.com/mfaisalkhatri\"\u003e\n        \u003cimg alt=\"Mohammad Faisal Khatri: Framework Tester.\" src=\"https://github.com/mfaisalkhatri.png\" width=100 height=100 /\u003e\n      \u003c/a\u003e\n    \u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/div\u003e\n\n## :gift_heart: Thanks for the support.\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"http://browserstack.com\"\u003e\n    \u003cimg src=\"assets/browserstack-logo-600x315.png\" width=300 /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nFor allowing us to run our unit tests on different platforms.\n\n## :ticket: Versioning ideology\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"http://semver.org/\"\u003e\n    \u003cimg src=\"assets/semver.png\" width=300 /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## :copyright: Wasiq Bhamla\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"http://www.apache.org/licenses/LICENSE-2.0\"\u003e\n    \u003cimg src=\"http://www.apache.org/img/asf_logo.png\" width=300 /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n[home]: https://github.com/wasiqb/coteafs-appium\n\n[circleci]: https://circleci.com/gh/WasiqB/coteafs-appium\n\n[wiki]: https://wasiqb.github.io/projects/appium/intro/\n\n[site]: https://wasiqb.github.io\n\n[issues]: https://github.com/WasiqB/coteafs-appium/issues?q=something\n\n[new issue]: https://github.com/WasiqB/coteafs-appium/issues/new\n\n[milestones]: https://github.com/WasiqB/coteafs-appium/milestones\n\n[maven]: https://maven-badges.herokuapp.com/maven-central/com.github.wasiqb.coteafs/appium\n\n[contributing]: .github/CONTRIBUTING.md\n\n[intro-doc]: https://wasiqb.github.io/projects/appium\n\n[discord]: https://discord.gg/vkR9TBdKxZ\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWasiqB%2Fcoteafs-appium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FWasiqB%2Fcoteafs-appium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWasiqB%2Fcoteafs-appium/lists"}