{"id":14978851,"url":"https://github.com/prashanth-sams/python-appium-framework","last_synced_at":"2025-08-06T11:22:15.955Z","repository":{"id":50481820,"uuid":"203598768","full_name":"prashanth-sams/python-appium-framework","owner":"prashanth-sams","description":"Complete Python Appium framework in 360 degree","archived":false,"fork":false,"pushed_at":"2020-10-15T14:41:44.000Z","size":20535,"stargazers_count":75,"open_issues_count":2,"forks_count":40,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-02-01T15:11:25.508Z","etag":null,"topics":["allure-report","android","appium","appium-automation","appium-framework","appium-python","docker","framework","html-report","ios","parallel","parallel-tests","pytest","python","python-appium-framework","runner","selenium","selenium-python","selenium-webdriver"],"latest_commit_sha":null,"homepage":"","language":"Python","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/prashanth-sams.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}},"created_at":"2019-08-21T14:14:38.000Z","updated_at":"2025-01-08T10:40:32.000Z","dependencies_parsed_at":"2022-09-10T22:01:48.554Z","dependency_job_id":null,"html_url":"https://github.com/prashanth-sams/python-appium-framework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prashanth-sams%2Fpython-appium-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prashanth-sams%2Fpython-appium-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prashanth-sams%2Fpython-appium-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/prashanth-sams%2Fpython-appium-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/prashanth-sams","download_url":"https://codeload.github.com/prashanth-sams/python-appium-framework/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238654967,"owners_count":19508531,"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","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":["allure-report","android","appium","appium-automation","appium-framework","appium-python","docker","framework","html-report","ios","parallel","parallel-tests","pytest","python","python-appium-framework","runner","selenium","selenium-python","selenium-webdriver"],"created_at":"2024-09-24T13:58:31.706Z","updated_at":"2025-02-13T12:32:33.158Z","avatar_url":"https://github.com/prashanth-sams.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Python Appium Framework\n\u003e Complete Python Appium framework in 360 degree \n\n## Features\n- [x] Locator strategy\n- [x] Hooks (unittest)\n- [x] Helper methods\n- [x] Database connectivity + SSH Tunneling\n- [x] Screenshot on failure\n- [x] Docker support for Android\n- [x] Handle local storage\n- [x] Bash Runner\n- [x] Slack notify\n- [x] Define environment variable\n- [x] HTML report\n- [x] JSON report\n- [x] Allure report\n- [x] CLI arguments as a fixture (Pytest)\n- [x] In-house data storage\n- [x] Logger\n- [x] Runner (Pytest)\n- [x] Runner percentage with style (Pytest)\n- [x] Parallel Tests (Pytest) x2\n- [x] Re-run failures (Pytest)\n- [x] Test script validation\n\n## Installation\nInstall python libraries\n\n    pip3 install -r requirements.txt\n\n## Test Runner\n\n| Action         | Command            |\n| -------------- | ---------          |\n| Bash runner    | `bash runner/android/smoke_run.sh` |\n| Default        | `python3 -m pytest src/spec/* --app=android` |\n| Rerun failures | `python3 -m pytest src/spec/home_test.py --app=android --reruns 1` |\n| Parallel Test  | `python3 -m pytest src/spec/home_test.py --app=android -v -n2` |\n\n#### Docker Run\n\u003e Android test - x1 run\n```shell script\ndocker run --privileged -d -p 6080:6080 -p 4723:4723 -p 5554:5554 -p 5555:5555 \\ \n-v $(pwd)/data/apps/Android-NativeDemoApp-0.2.1.apk:/root/tmp/Android-NativeDemoApp-0.2.1.apk \\\n-e DEVICE=\"Samsung Galaxy S9\" -e APPIUM=true --name android-container \\\nbudtmo/docker-android-x86-11.0\n```\n**noVnc interface:** http://localhost:6080\n\n## Test Report\n| Type           | Command            |\n| -------------- | ---------          |\n| HTML Report    | `python3 -m pytest src/spec/android/*.py --html-report=report/report.html --app=android` |\n| JSON Report    | `python3 -m pytest src/spec/android/*.py --json=report/json/report.json --app=android` |\n| Allure Report    | `python3 -m pytest src/spec/android/* --alluredir=report --app=android` |\n\n- Download allure commandline \nhttps://github.com/allure-framework/allure2/releases\n\n\u003e  generate allure report\n```\nallure serve report/\n```\n\n## Wrapper Methods\n| Methods                  | Usage                                                                  |\n| --------------           | ---------                                                              |\n| element                  | `App.element(self, locator)`                                           |\n| elements                 | `App.elements(self, locactor)`                                         |\n| is_displayed             | `App.is_displayed(self, locator)`                                      |\n| is_displayed \u003e elements  | `App.is_displayed(self, locator, index=0)`                             |\n| is_exist                 | `App.is_exist(self, locator)`                                          |\n| is_exist \u003e elements      | `App.is_exist(self, locator, index=0)`                                 |\n| tap                      | `App.tap(self, locator)`                                               |\n| tap \u003e elements           | `App.tap(self, locator, index=0)`                                      |\n| double_tap               | `App.double_tap(self, locator)`                                        |\n| double_tap \u003e elements    | `App.double_tap(self, locator, index=0)`                               |\n| click                    | `App.click(self, locator)`                                             |\n| click \u003e elements         | `App.click(self, locator, index=0)`                                    |\n| swipe                    | `App.swipe(self, start=locator, dest=locator)`                         |\n| swipe \u003e elements         | `App.swipe(self, start=(locator, 2), dest=(locator, 1))`               |\n| send_keys                | `App.send_keys(self, locator, 'text')`                                 |\n| send_keys \u003e elements     | `App.send_keys(self, locator, 'text', index=0)`                        |\n| get_screen_size          | `App.get_screen_size(self)`                                            |\n| back                     | `App.back(self)`                                                       |\n| close                    | `App.close(self)`                                                      |\n| reset                    | `App.reset(self)`                                                      | \n| launch_app               | `App.send_keys(self, locator, 'text'`                                  | \n| tap_by_coordinates       | `App.tap_by_coordinates(self, x=338, y=204)`                           |\n| assert_text              | `App.assert_text(self, 'actual', 'expected')`                          |\n| assert_text \u003e elements   | `App.assert_text(self, 'actual', 'expected', index=0)`                 |\n| assert_size              | `App.assert_size(self, locator, 'more than 1')`                        |\n|                          | `App.assert_size(self, locator, 'greater than 1')`                     |\n|                          | `App.assert_size(self, locator, 'above 1')`                            |\n|                          | `App.assert_size(self, locator, '\u003e 1')`                                |\n|                          | `App.assert_size(self, locator, 'less than 1')`                        |\n|                          | `App.assert_size(self, locator, 'below 1')`                            |\n|                          | `App.assert_size(self, locator, '\u003c 1')`                                |\n|                          | `App.assert_size(self, locator, 'equal to 1')`                         |\n|                          | `App.assert_size(self, locator, '== 1')`                               |\n| assert_boolean           | `App.assert_boolean(True, True)`                                       |\n| swipe_until              | `App.swipe_until(self, locator, start_x=144, start_y=434, count=20)`   |\n\n![](https://i.imgur.com/5vjklOb.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprashanth-sams%2Fpython-appium-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprashanth-sams%2Fpython-appium-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprashanth-sams%2Fpython-appium-framework/lists"}