Appium作为移动端的测试框架,可以用于自动化测试手机App(下载地址)。Appium自身不带图形界面,必须配合测试代码使用。
为方便初期调试,可使用Appium Desktop(点击下载),它不仅包含了Appium还自带了模拟器界面,还可以让你在电脑端通过图形界面操控手机App。
测试安卓App前的准备工作
要使用Appium测试安卓App,必须满足以下几个先决条件:
- 安卓手机必须开启USB调试及USB安装权限。(小米手机每次测试时都会弹出安装提示,不建议使用小米手机。)
- 电脑端安装并配置好安卓开发环境,确保
adb
命令可用。 - 调试时手机不能黑屏,建议将超时时间设长一点。
Appium桌面版的使用
启动Appium Desktop,点击Start Server
启动服务。服务启动成功后,通过按键Ctrl+N
或菜单File - New Session Window
创建一个测试,这时需要配置测试目标:
以下几个参数是必须的:
platformName
固定为Android
deviceName
即设备名称。连上测试手机后,可通过adb devices -l
查看,model
后面的字符串即为设备名。例如对于下面的返回结果,设备名为HWP30
。<device_id> device usb:1-2.4 product:P3T model:HWP30 device:HW12921C transport_id:3
appPackage
及appActivity
。可通过以下办法获取这两个参数值:将手机连上电脑,在手机上打开目标应用,然后使用adb shell
命令进入adb控制台(如果你的电脑连了多台手机,请使用adb -s <device_id> shell
),输入以下命令:$dumpsys activity | grep mFocusedActivity
返回结果如 mFocusedActivity: ActivityRecord{xxx992 u0
com.tencent.mm/.ui.LauncherUI t122}
。其中加粗的部分即为appPackage
和appActivity
。
使用noReset避免数据被清除
使用Appium测试时,默认每次测试时均会先清除应用原有数据。
如果你使用Appium Desktop在真机上测试,一定要注意这点。比如你在Appium Desktop里通过返回或Home键返回了手机主界面,再通过点击事件点击某个应用,这个应用即使在之前没有被配置为待测应用,其数据仍然会被清除!
通过将noReset
设为true
可让Appium保留App数据,这样就避免了上述问题。
提示:配置好后,右侧自动生成JSON文本。如果想保存配置,下次再用,可以点击旁边的编辑按钮,复制为文本,保存在本地。下次再复制进来就可以了。
点击Start Session
就可以开机在电脑上调试手机App了。点击界面上的按钮等元素,就可以查看此元素的信息。
提示:如果连接成功后发现手机与电脑端Appium显示的界面不一致,可点击刷新按钮同步一下显示。
使用Python自动化
Appium Python客户端通过Selenium实现。使用方法与Selenium非常相似,这里就不扩展了。
调用前需要确保已在电脑端开启Appium服务(通过Appium或Appium Desktop开启均可)。
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
PLATFORM='Android'
deviceName='XXX'
app_package='com.tencent.mm'
app_activity='.ui.LauncherUI'
driver_server='http://127.0.0.1:4723/wd/hub'
class AppTest():
def __init__(self):
self.desired_caps={
'platformName':PLATFORM,
'deviceName':deviceName,
'appPackage':app_package,
'appActivity':app_activity,
'noReset': True,
}
self.driver=webdriver.Remote(driver_server, self.desired_caps)
self.wait=WebDriverWait(self.driver,300)
def get_page(self, text):
self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/tb')))
m_contacts = self.driver.find_elements(by= By.ID, value='com.tencent.mm:id/tb')
m_contacts[1].click()
self.wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/kr')))
c_list = self.driver.find_elements(by= By.ID, value='com.tencent.mm:id/kr')
c_list[3].click()
关于微信+Appium的一点说明
微信近来禁止一切模拟器操作,一旦发现,直接封号!想用微信自动化一些微信操作的可洗洗睡了。