前言
因为上周要去上海,所以请思寒老师替我代课,非常感谢思寒从北京过来(非常感谢)。
看了下这周的留的作业如下 作业链接
作业1
启动雪球,打开个人消息页,切换到后台3s,然后再模拟电话call
作业2
打开最新版本的雪球,进入 交易->基金->蛋卷基金安全开户->输入手机号,把这个过程自动化并把代码和最后一步截图贴到回复里
作业1 思路
启动雪球,打开个人消息页,切换到后台3s,然后再模拟电话call
要完成作业,大概需要完成下面几个步骤
-
获取待测应用的
appPackage
和appActivity
-
构造正确的
DesiredCapabilities
-
启动Appium Server,启动IPython客户端调试代码,打开一个编辑器记录调试通过的代码
-
模拟电话Call (目前文档看Python还没有实现这个API,下面用shell命令来实现)
1. 获取应用的appPackage和appActivity
手机打开雪球应用
如果是Mac,打开一个终端,Windows的话打开一个Git-Bash或Cmder。不推荐用自带的Cmd.exe, 因为没有我们需要用的grep命令
输入shell命令,下面这个命令会把所有打开应用的package和activity都显示出来。我们只需要看package是com.xueqiu.android
的就够了。
$ adb shell dumpsys activity activities | grep -i category.LAUNCHER | grep -o cmp=.*
cmp=com.netease.cloudmusic/.activity.LoadingActivity (has extras) }
cmp=com.netease.cloudmusic/.activity.LoadingActivity}
cmp=com.netease.cloudmusic/.activity.LoadingActivity (has extras) }
cmp=com.xueqiu.android/.view.WelcomeActivityAlias (has extras) }
cmp=com.xueqiu.android/.common.SplashActivity}
记录下appPackage com.xueqiu.android
和 appActivity .view.WelcomeActivityAlias
PS: 暂时我还不知道别的好办法,欢迎拍砖
2. 构造正确的DesiredCapabilities
为了方便起见,这里提供一个精简版的,一个复杂版的配置。个人比较推荐的是精简版的加上newCommandTimeout
参数。
精简版
{
"platformName": "Android",
"deviceName": "whatever I do not care",
"appPackage": "com.xueqiu.android",
"appActivity": ".view.WelcomeActivityAlias"
}
复杂版
{
"platformName": "Android",
"deviceName": "whatever I do not care",
"appPackage": "com.xueqiu.android",
"appActivity": ".view.WelcomeActivityAlias",
"newCommandTimeout": 600, # session过期时间10分钟,默认1分钟
"unicodeKeyboard": True, # 使用Appium输入法,以便支持中文输入
"resetKeyboard": True, # Session结束后,重置回系统输入法
"automationName": "UiAutomator2", # 默认uiautomator1,需要Android的版本(猜测是>=4.4,没看到那里有文档写)
"udid": "3578298f", # 通过adb devices获取,如果只有一个设备的话可以不写
"noReset": True, # 是否不pm clear掉应用的数据,默认False
}
3. 编写测试、保存代码
电脑上先安装个IPython pip install ipython
静静的等待安装结束。
打开命令行终端,输入ipython
$ ipython
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]:
再打开一个终端(假设你已经把Appium安装好了),命令行启动Appium
$ appium --relaxed-security --session-override
[Appium] Welcome to Appium v1.8.1
[Appium] Non-default server args:
[Appium] sessionOverride: true
[Appium] relaxedSecurityEnabled: true
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
--relaxed-security
是为了后面执行shell命令用的。(看了下Appium Desktop没有发现,设置这个的地方,只有命令行启动appium了)
--session-override
允许session覆盖,一般都是开着的,方便调试。
这是一个支持自动补全的交互式Python解释器终端。
将下面的代码,依次输入到这个解释器中
from appium import webdriver
caps = {
"platformName": "Android",
"deviceName": "whatever I do not care",
"appPackage": "com.xueqiu.android",
"appActivity": ".view.WelcomeActivityAlias",
"newCommandTimeout": 600, # session过期时间10分钟,默认1分钟
}
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
driver.implicitly_wait(30) # 设置元素查找时间30s,默认0s
print(driver.session_id) # 查看当前的session id
比如我们现在的SessionId是90cf88e9-cd3b-4caf-bcdc-ea6f13254ecf
打开Appium Desktop
这里我们要用到它的Inspector。不要点击Start Server
,因为我们已经启动了一个Server,会冲突的。
菜单栏里面的File -> New Session Window
依次点击红框中的按钮,确保刷新出来的SessionId和我们控制台打出来的Id是一样的就好。
Appium有时候会没响应,这个时候,也没什么好办法,只能重启它。我用的是木木模拟器,好像比我手里的锤子手机要稳定那么一点。
接下来就是用Appium Inspector自带的录制功能,把操作代码撸出来。
其他的一些操作,把应用放到后台3s钟就需要查官网的API文档了。
链接 https://appium.io/docs/en/commands/device/app/background-app/
直接照抄官网的例子 driver.background_app(3)
GSM CALL模拟电话
模拟GSM Call怎么做呢。查了下文档。https://appium.io/docs/en/commands/device/network/gsm-call/
惊讶的发现,Python还没有实现,Java也没有实现。
不过没有关系,谷歌了一下。我们看到Shell命令也可以做到模拟打电话
adb shell am start -a android.intent.action.CALL tel:8888888888888
如何通过Appium执行Shell命令呢。一通谷歌之后,我们发现了下面的方法, 注意,文档里提到了appium启动的时候需要增加--relaxed-security
参数。
http://appium.readthedocs.io/en/latest/en/writing-running-appium/android/android-shell/
result = driver.execute_script('mobile: shell', {
'command': "adb shell am start -a android.intent.action.CALL tel:8888888888888",
})
将刚才用到的代码保存起来,就可以当成作业了。至此作业1完成。
作业2
打开最新版本的雪球,进入 交易->基金->蛋卷基金安全开户->输入手机号,把这个过程自动化并把代码和最后一步截图贴到回复里
看了下,作业2跟作业1差不多的步骤,这里我就不重复写了。