Skip to content

Repository files navigation

Python Appium Framework

Complete Python Appium framework in 360 degree

Features

  • Locator strategy
  • Hooks (unittest)
  • Helper methods
  • Database connectivity + SSH Tunneling
  • Screenshot on failure
  • Docker support for Android
  • Handle local storage
  • Bash Runner
  • Slack notify
  • Define environment variable
  • HTML report
  • JSON report
  • Allure report
  • CLI arguments as a fixture (Pytest)
  • In-house data storage
  • Logger
  • Runner (Pytest)
  • Runner percentage with style (Pytest)
  • Parallel Tests (Pytest) x2
  • Re-run failures (Pytest)
  • Test script validation

Installation

Install python libraries

pip3 install -r requirements.txt

Test Runner

ActionCommand
Bash runnerbash runner/android/smoke_run.sh
Defaultpython3 -m pytest src/spec/* --app=android
Rerun failurespython3 -m pytest src/spec/home_test.py --app=android --reruns 1
Parallel Testpython3 -m pytest src/spec/home_test.py --app=android -v -n2

Docker Run

Android test - x1 run

docker run --privileged -d -p 6080:6080 -p 4723:4723 -p 5554:5554 -p 5555:5555 \ 
-v $(pwd)/data/apps/Android-NativeDemoApp-0.2.1.apk:/root/tmp/Android-NativeDemoApp-0.2.1.apk \
-e DEVICE="Samsung Galaxy S9" -e APPIUM=true --name android-container \
budtmo/docker-android-x86-11.0

noVnc interface:http://localhost:6080

Test Report

TypeCommand
HTML Reportpython3 -m pytest src/spec/android/*.py --html-report=report/report.html --app=android
JSON Reportpython3 -m pytest src/spec/android/*.py --json=report/json/report.json --app=android
Allure Reportpython3 -m pytest src/spec/android/* --alluredir=report --app=android

generate allure report

allure serve report/

Wrapper Methods

MethodsUsage
elementApp.element(self, locator)
elementsApp.elements(self, locactor)
is_displayedApp.is_displayed(self, locator)
is_displayed > elementsApp.is_displayed(self, locator, index=0)
is_existApp.is_exist(self, locator)
is_exist > elementsApp.is_exist(self, locator, index=0)
tapApp.tap(self, locator)
tap > elementsApp.tap(self, locator, index=0)
double_tapApp.double_tap(self, locator)
double_tap > elementsApp.double_tap(self, locator, index=0)
clickApp.click(self, locator)
click > elementsApp.click(self, locator, index=0)
swipeApp.swipe(self, start=locator, dest=locator)
swipe > elementsApp.swipe(self, start=(locator, 2), dest=(locator, 1))
send_keysApp.send_keys(self, locator, 'text')
send_keys > elementsApp.send_keys(self, locator, 'text', index=0)
get_screen_sizeApp.get_screen_size(self)
backApp.back(self)
closeApp.close(self)
resetApp.reset(self)
launch_appApp.send_keys(self, locator, 'text'
tap_by_coordinatesApp.tap_by_coordinates(self, x=338, y=204)
assert_textApp.assert_text(self, 'actual', 'expected')
assert_text > elementsApp.assert_text(self, 'actual', 'expected', index=0)
assert_sizeApp.assert_size(self, locator, 'more than 1')
App.assert_size(self, locator, 'greater than 1')
App.assert_size(self, locator, 'above 1')
App.assert_size(self, locator, '> 1')
App.assert_size(self, locator, 'less than 1')
App.assert_size(self, locator, 'below 1')
App.assert_size(self, locator, '< 1')
App.assert_size(self, locator, 'equal to 1')
App.assert_size(self, locator, '== 1')
assert_booleanApp.assert_boolean(True, True)
swipe_untilApp.swipe_until(self, locator, start_x=144, start_y=434, count=20)