啟動
Appium啟動時需要指定一些通用配置,統(tǒng)稱為Desired Capabilities,具體的一些參數(shù)可以參考Appium服務器初始化參數(shù)。這里介紹一些通用的參數(shù)與一些常見的問題。
platformName
手機操作系統(tǒng)
platformVersion
手機操作系統(tǒng)版本
deviceName
手機類型
app
待測app的路徑
appActivity, appPackage
appActivity與appPackage指用于啟動待測app的activityName與packageName,appium(1.6.4)已經(jīng)支持activityName與packageName的自動檢測,這兩個參數(shù)已經(jīng)可以省略了
newCommandTimeout
兩條appium命令間的最長時間間隔,若超過這個時間,appium會自動結(jié)束并退出app
noReset, fullReset
noReset 不要在會話前重置應用狀態(tài)。默認值false。 fullReset (Android) 通過卸載而不是清空數(shù)據(jù)來重置應用狀態(tài)。在Android上, 這也會在會話結(jié)束后自動清除被測應用。默認值false。
unicodeKeyboard, resetKeyboard
在輸入的時候,可能出現(xiàn)鍵盤擋住控件的情況,這時候需要使用 appium 提供的輸入法(支持輸入多語言,沒有鍵盤 ui ),unicodeKeyboard 為 true 表示使用 appium-ime 輸入法。 resetKeyboard 表示在測試結(jié)束后切回系統(tǒng)輸入法。
appWaitActivity, appWaitPackage
appium需要等待的activityName與packageName,與appActivity不同的是,對于有啟動動畫的app來說,appWaitActivity應該是啟動activity消失后出現(xiàn)的activity。這兩個參數(shù)可以指定多個。
控件定位
android sdk的tools目錄下自帶一個元素查看工具uiautomatorviewer,通過這個工具可以獲取到app的各個元素屬性,輔助我們編寫相關(guān)的腳本,uiautomatorviewer的界面如下:

常用的定位方法:
id
使用元素的resource-id屬性定位,如:
driver.find_element_by_id('com.android.calculator2:id/digit1')
class
使用元素的class屬性定位,如:driver.find_element_by_class_name('android.widget.Button')
xpath
定位速度很慢,不推薦。xpath的定位方式很多,這里就不一一敘述了。
基本操作
.click()
點擊操作,一般用在查找元素后面,如:
driver.find_element_by_id('com.android.calculator2:id/digit1').click()
.send_keys
輸入操作,一般用在查找元素后面,如:
driver.find_element_by_class_name('android.widget.EditText').send_keys("123456")
.clear()
清除文本框內(nèi)的所有字段,如:
driver.find_element_by_class_name('android.widget.EditText').clear()
swipe()
滑動操作,如:
driver.swipe(900,1320,180,600,1000)
括號內(nèi)的五個值分別是x坐標的起始位置、y坐標的起始位置、x坐標的目標位置、y坐標的目標位置和滑動時長(毫秒)
wait_activity()
等待activity出現(xiàn)時間,如:
wait_activity('.activity.HomeActivity',5)
括號內(nèi)前面的是要等待的activity,后面的是超時時間,單位是秒。若超過這個時間等待的activity還沒出現(xiàn)就跳過這個命令。
組織用例
unittest是python的一個單元測試框架,它可以幫助我們有效組織用例,把用例的不同部分區(qū)分開來。我們寫一個登錄的測試腳本:

import unittest
from time import sleep
from appium import webdriver
class Login(unittest.TestCase):
def setUp(self):
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '6.0'
desired_caps['deviceName'] = 'Huawei'
desired_caps['appPackage'] = 'com.happy.food'
desired_caps['appActivity'] = 'com.happy.food.activity.LauncherActivity'
desired_caps["unicodeKeyboard"] = True
desired_caps["resetKeyboard"] = True
url = "http://127.0.0.1:4723/wd/hub"
global driver
driver = webdriver.Remote(url,desired_caps)
sleep(3)
def test_login(self):
EditText = driver.find_elements_by_class_name("android.widget.EditText")
#獲取所有的輸入框
EditText[0].send_keys("13410066133")
EditText[1].send_keys("1234567a")
driver.find_element_by_id("com.happy.food:id/login").click()
sleep(3)
def tearDown(self):
driver.quit()
if __name__ == '__main__':
unittest.main()
運行腳本:
/Users/yaulola/Public/appium-Android/venv/bin/python /Users/yaulola/Desktop/appium/test.py
.
----------------------------------------------------------------------
Ran 1 test in 42.277s
OK
Process finished with exit code 0
setUp在每條用例前執(zhí)行,
tearDown在每條用例后執(zhí)行,
test_xxx 為要執(zhí)行的用例,必須以test開頭。