确定包名
在安卓模拟器上打开待测应用
在shell窗口输入
adb shell dumpsys window | grep mCurrentFocus
(windows系统将grep
替换成findstr
)
会得到待测应用的appPackage和appActivity
比如得到输出mCurrentFocus=Window{9a14051 u0 com.vmware.view.client.android/com.vmware.view.client.android.BrokerAddressPrompt}
那么appPackage就是com.vmware.view.client.android
,appActivity就是com.vmware.view.client.android.BrokerAddressPrompt
或者直接写.BrokerAddressPrompt
注意:可能应用程序无法通过脚本自动启动,看下是不是你的appActivity找错了,因为有时启动的activity和进入应用以后停留界面的activity不同,我们需要找到启动的第一activity。
建立session
连接应用程序的代码如下:
# -*- coding: utf-8 -*-
from appium import webdriver
from selenium.webdriver.common.by import By
from appium.webdriver.extensions.android.nativekey import AndroidKey
from time import sleep
desired_caps = {
'platformName': 'Android',
'platformVersion': '12',
'deviceName': 'emulator-5554',
'appPackage': 'com.vmware.view.client.android',
'appActivity': '.VMwareViewPcoipActivity',
'noReset': True,
'newCommandTimeout': 6000,
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #4622
配置参数说明:
noReset设为True,则每次测试不会重置app
deviceName可以随便起
测试过程及原理
Appium Server填好服务器的host、port和pathhttp://127.0.0.1:4723/wd/hub
配置里写好Android SDK和JAVAHOME的路径,否则会报错
使用Android自带的UIAutomator,或者下载Appium Inspector,因为我的m1芯片用不了前者,所以下载了后者。
点击UI界面的各个控件,会在右侧显示控件信息,一般是根据id来表示控件。
然后就通过driver确定元素。
修改安卓模拟器hosts文件
参考:How to edit /etc/hosts file in Android Studio emulator running in nougat?
步骤:
使用安卓自带的emulator启动模拟器,注意要加上-writable-system
参数(否则后面adb remount
会failed)
/Users/yueh2/Library/Android/sdk/emulator/emulator -avd Pixel_2_API_31 -writable-system
adb root
adb remount
使用自己修改好的hosts文件替换安卓里面的hosts文件
adb push /Users/yueh2/Desktop/hosts /system/etc/hosts
验证修改结果:
进入安卓命令行
adb shell
查看安卓hosts文件
cat /system/etc/hosts
自己写的hosts文件内容
127.0.0.1 localhost
::1 ip6-localhost
10.0.2.2 test-server.local
主要是添加了最后一行
10.0.2.2
是安卓模拟器连接PC的 127.0.0.1
地址的方式,具体参考:why do we use 10.0.2.2 to connect to local web server instead of using computer ip address in android client
启动本地模拟服务器
我们本地有一个自己写的专用来测试的服务器(因为client要连到远程桌面,但为了测试我们就用一个假的),要用它测试的话,就要启动它,以如下命令启动:
python server/main.py -d -s 0.0.0.0 -p 4443 -m launchitems auth_windowspwd
然后在client里就连接到test-server.local:4443
这个域名(必须用这个域名,可在hosts文件里改,因为测试用例里都是用这个名字)
username:user
password:ca$hc0w
运行
nosetests sampleTests.py
授予权限
- 一开始尝试了这个命令:
adb install -g xxx.apk
,安装时添上-g的参数,就可以赋予apk所有权限。不生效! - 然后尝试这个命令:(adb shell)
pm grant com.vmware.view.client.android android.permission.READ_PHONE_STATE
,
com.vmware.view.client.android
是包名,
android.permission.READ_PHONE_STATE
是权限名。
这个当下设置能成功,但应用reset之后就不生效了! - 最后,在
desired_caps
添加autoGrantPermissions': True,
,成功!