blob: 68ed7d4a70d822ff286332e5fb15618213a43a7f [file] [log] [blame]
#! /usr/bin/env python
import sys
import os
import time
import settings
from subprocess import Popen, PIPE
from com.dtmilano.android.viewclient import ViewClient
# App actions
def action_login(device, serialno):
print("login")
device.type(settings.username)
device.press('KEYCODE_DPAD_DOWN')
device.type(settings.password)
device.press('KEYCODE_ENTER')
# time to login
time.sleep(10)
# lose focus
device.press('KEYCODE_DPAD_DOWN')
time.sleep(1)
def action_open_my_sites(device, serialno):
print("open my sites")
device.press('KEYCODE_TAB')
for i in range(5):
device.press('KEYCODE_DPAD_LEFT')
# Wait for gravatars to load
time.sleep(2)
def action_open_reader_freshlypressed(device, serialno):
print("open reader")
# Open the reader
for i in range(5):
device.press('KEYCODE_DPAD_LEFT')
device.press('KEYCODE_DPAD_RIGHT')
device.press('KEYCODE_ENTER')
# Wait for the reader to load articles / pictures
time.sleep(5)
def action_open_notifications(device, serialno):
print("open notifications tab")
# Open the reader
for i in range(5):
device.press('KEYCODE_DPAD_LEFT')
for i in range(4):
device.press('KEYCODE_DPAD_RIGHT')
device.press('KEYCODE_ENTER')
time.sleep(5)
def action_open_me(device, serialno):
print("open me tab")
# Open the reader
for i in range(5):
device.press('KEYCODE_DPAD_LEFT')
for i in range(2):
device.press('KEYCODE_DPAD_RIGHT')
device.press('KEYCODE_ENTER')
time.sleep(5)
def action_open_editor_and_type_text(device, serialno):
print("open editor")
# Open My Sites
for i in range(5):
device.press('KEYCODE_DPAD_LEFT')
viewclient = ViewClient(device, serialno)
viewclient.dump()
view = viewclient.findViewById("org.wordpress.android:id/fab_button")
view.touch()
time.sleep(2)
viewclient.dump()
view = viewclient.findViewById("org.wordpress.android:id/post_content")
# Type a sample text (spaces can't be entered via device.type())
view.type(settings.example_post_content)
time.sleep(2)
def action_open_stats(device, serialno):
print("open stats tab")
device.press('KEYCODE_TAB')
for i in range(5):
device.press('KEYCODE_DPAD_LEFT')
viewclient = ViewClient(device, serialno)
viewclient.dump()
view = viewclient.findViewById("org.wordpress.android:id/row_stats")
view.touch()
time.sleep(5)
# Utilities
def lose_focus(serialno):
# tap point 0,0 to lose focus
_adb_shell(serialno, " input tap 0 0")
time.sleep(1)
def take_screenshot(serialno, filename):
os.popen("adb -s '%s' shell /system/bin/screencap -p /sdcard/screenshot.png" % (serialno))
os.popen("adb -s '%s' pull /sdcard/screenshot.png '%s'" % (serialno, filename))
def launch_activity(device, package, activity):
component = package + "/" + activity
FLAG_ACTIVITY_NEW_TASK = 0x10000000
device.startActivity(component=component, flags=FLAG_ACTIVITY_NEW_TASK)
time.sleep(2)
def _adb_shell(serialno, command):
print("adb -s '%s' shell \"%s\"" % (serialno, command))
os.popen("adb -s '%s' shell \"%s\"" % (serialno, command))
def change_lang_settings(serialno, lang):
adb_command = "su -c 'setprop persist.sys.language %s; setprop persist.sys.country %s; stop; start'"
_adb_shell(serialno, adb_command % (lang, lang))
# time to reload
time.sleep(15)
unlock_screen(serialno)
def unlock_screen(serialno):
_adb_shell(serialno, "input keyevent 82")
time.sleep(1)
def reinstall_apk(serialno, packagename, apk):
os.popen("adb -s '%s' uninstall '%s'" % (serialno, packagename))
os.popen("adb -s '%s' install '%s'" % (serialno, apk))
def back(device):
device.press('KEYCODE_BACK')
# Main scenario + screenshots
def run_tests_for_device_and_lang(device, serialno, filename, lang, packagename, apk):
# Install the apk`
reinstall_apk(serialno, packagename, apk)
# Change language setting
change_lang_settings(serialno, lang)
# Launch the app
launch_activity(device, packagename, "org.wordpress.android.ui.WPLaunchActivity")
take_screenshot(serialno, lang + "-99-login-screen-" + filename)
# Login into the app
action_login(device, serialno)
# Action!
action_open_my_sites(device, serialno)
take_screenshot(serialno, lang + "-1-my-sites-" + filename)
action_open_reader_freshlypressed(device, serialno)
take_screenshot(serialno, lang + "-2-reader-discover-" + filename)
action_open_me(device, serialno)
take_screenshot(serialno, lang + "-3-me-tab-" + filename)
action_open_notifications(device, serialno)
take_screenshot(serialno, lang + "-4-notifications-" + filename)
action_open_stats(device, serialno)
take_screenshot(serialno, lang + "-5-stats-" + filename)
back(device)
action_open_editor_and_type_text(device, serialno)
take_screenshot(serialno, lang + "-6-editor-" + filename)
# Close virtual keyboard
back(device)
# Close the editor
back(device)
def list_devices():
devices = []
process = Popen("adb devices -l", stdout=PIPE, shell=True)
for line in iter(process.stdout.readline, ''):
split = line.split()
if len(split) <= 1 or split[0] == "List":
continue
devices.append({"name": split[3].replace("model:", ""), "serialno": split[0]})
process.communicate()
return devices
def run_tests_on_device(packagename, apk, serialno, name, lang):
device, serialno = ViewClient.connectToDeviceOrExit(verbose=False, serialno=serialno)
filename = name + ".png"
run_tests_for_device_and_lang(device, serialno, filename, lang, packagename, apk)
def run_tests_on_all_devices(packagename, apk, lang):
devices = list_devices()
if not devices:
print("No device found")
return
for device in devices:
print("Running on %s - language: %s" % (device, lang))
run_tests_on_device(packagename, apk, device["serialno"], device["name"], lang)
def run_tests_on_all_devices_for_all_languages(packagename, apk):
for lang in settings.languages:
run_tests_on_all_devices(packagename, apk, lang)
def main():
if len(sys.argv) < 3:
sys.exit("usage: %s packagename apk" % sys.argv[0])
packagename = sys.argv.pop(1)
apk = sys.argv.pop(1)
run_tests_on_all_devices_for_all_languages(packagename, apk)
main()