python+appium对于语音交互式的测试(不支持在线语音识别)

一、项目介绍

本人现在所接触的是一项基于百度SDK的一款Android应用的语音导航系统,其主要功能时可以通过语音下发语音指令进行导航、打电话、回复短信、发送微信、听音乐等语音交互式应用(公司开发产品)

二、测试任务

实现语音指令下发的基本功能测试(本次测试的主要是通过python3.5+appium+adb)

三、话不多说开始写脚本

1、首先要解决的是在线语音合成的问题,要实现语音指令下发,得实现在线语音合成。在这里起初我使用的是文字转语音工具进行语音合成,但是这似乎不能从根本上解决问题,比如公司要求现在要实现10000个地址poi进行可靠性测试(测试地址是否能正常搜索到结果和应用翻译的正确率(这个语音识别是百度语音SDK的东西)),所以最后更改了方法,通过利用百度语音在线合成的方式进行语音指令合成,这样不管多少都能轻松应对,这是百度在线语音合成链接https://cloud.baidu.com/doc/SPEECH/TTS-Online-Python-SDK.html#.E6.96.B0.E5.BB.BAAipSpeech,其中包括了响应模块的下载和方法的使用,其中APP_ID,API_KEY ,SECRET_KEY这几个参数值需要你从开发那里获取,这样我们就可以顺利的进行语音指令下发了,下图就是调用百度在线语音合成的一个方法,在result中的参数解释可看百度SDK链接。在高频率使用百度SDK时,有可能会出现连接百度在线语音合成出现连接断开(这个问题不知道为什么),在这里可以进行这样的处理

try:

is_baidu_SDK(zl)

except:

is_baidu_SDK(zl)

来解决

python+appium对于语音交互式的测试(不支持在线语音识别)

2、在语音指令下发后,还要进行应用翻译文本获取,相信后面的你们可以解决

PS:对应如下发不同的指令,应用会有不同的反馈状态(如:我没听清,该地址不存在,该指令不存在等都是在交互界面处一个id下出现的,在这里对不同的反馈要做不同的处理)比如:下发我要回家,那么应用可能会反馈(我没听清,请再说一次or你没有设置家)等这样的反馈(同时还有网络影响可能10秒20秒甚至更长的时间才进行反馈),而每一个反馈信息对应的反馈方式不同,在这里如果你处理时用WebDriverWait(driver,wtime, 0.5).until(EC.presence_of_element_located((By.xpath,‘xx’)或者使用EC.presence_of_element_located((By.id,‘xx’),这样的方式来处理,你会发现会出现很多问题,在这里你可以写一个方法来检测你需要检测的反馈文本,若文本变化,则返回这个文本,再使用相应的方式进行语音指令下发。如我在这里就写了一个while进行文本内容检查,若文本发生改变马上跳出该while循环,这样效率就大大提升了不少,而且也避免了很多问题

以上是本人拙劣的经验,若有其它好的方式请指教