Appium 在 Appium 自动化测试中实现输入语音

付海全 · 2017年02月21日 · 最后由 hmonline 回复于 2021年11月22日 · 3159 次阅读
本帖已被设为精华帖!

解决问题的思路

最近测试的项目中,被测产品有一个功能是类似微信的长按输入语音的功能,不过我们的产品是输入语音后进行语音识别后返回文字。本来以为这个是没有办法做成自动化测试的,因为没有在 appium 的 api 文档中找到上传语音文件的方法。继续思考了一下是不是可以利用 python 其他的第三方库来实现呢,通过上网搜索后找到了方法。大的思路是利用 appium 在手机上对产品中的按钮进行长按操作,同时使用 pygame 的音频播放函数在电脑上播放录音。

代码片段

注意:下面不是完整的代码,大家可以做一下参考,如果要实际使用的话,请将相关配置替换为其他的被测 app 信息,还有需要提前用电脑录好要使用的录音文件,我这次使用的是 mp3 格式的音频文件。要是测试的功能是输入语音来查询北京天气。

from appium import webdriver
from nose.tools import *
from pygame import mixer  #导入pygame方法用来后台播放音频文件
import unittest

class MyTestCase(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android' #设置操作平台
        --略--
        global driver
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

    @classmethod
    def tearDownClass(self):
        driver.quit() #退出当前应用

    def test_11_voice_weather_beijing(self):
        driver.find_element_by_id('com.my.app.test:id/btn_set_mode_voice').click() #点击切换到语音模式
        el = driver.find_element_by_id('com.my.app.test:id/btn_press_to_speak') #选中“按住说话”按钮
        elx = el.location.get('x')  #获取按钮的x坐标
        ely = el.location.get('y')  #获取按钮的y坐标
        mixer.init() 
        mixer.music.load('testmp3.mp3')  #加载要播放的录音文件
        mixer.music.play()    #后台播放录音
        driver.swipe(elx,ely,elx,ely,10000)     #长按按钮10秒,开始接收语音,语音内容是“北京天气”
        weather_text = driver.find_element_by_id('com.my.app.test:id/weather_region').text
        assert_equal(weather_text, "北京")   #检查天气显示的区域是否正确

代码分析

上面的代码中,首先是导入 pygame 和 appium 和 unittest 等包,然后是做 appium 的启动设置。接下来找到 “按住说话” 按钮,然后是获取这个按钮在手机上的像素位置,这里的 x 和 y 组合在一起的像素点是在按钮的左上角的像素点。然后使用 pygame.mixer 的方法来在电脑上后台播放 mp3 录音文件。接下来是使用 appium 的 swipe 方法,我个人理解是如果在一个特别小的范围内滑动一定时间的话,效果是和长按一样的。代码最后一行就是在按钮的左上角一个像素点上滑动 10 秒钟,这样和长按这个按钮 10 秒钟是一样的。

共收到 16 条回复 时间 点赞

有意思

😂 那怎么判断声音是一致的?去解析声音么?

必须赞

有意思

匿名 #5 · 2017年02月21日

666,但是怎么判断输入语音这个功能是 OK 的呢?要是一个 case 只有执行没有判断,感觉意义不是很大啊~

#5 楼 @wowotou 本来完整代码里是有断言语句判断的,被我删除了,稍后更新补上

思寒_seveniruby 将本帖设为了精华贴 02月22日 01:26

加精理由: 思路很赞简单实用.

匿名 #9 · 2017年02月22日

#8 楼 @seveniruby 所以思寒,更好的办法是?

#2 楼 @dadeshuo 我们的产品是类似智能助手的工具,这次测试的是语音查询北京天气的功能,可以检查返回的位置信息中是否包含 “北京” 两个字。

我们是直接第三方实现的。。插入一段,不是自己写的。

记得更新打赏二维码,你已经错过本轮的社区打赏了

13楼 已删除
14楼 已删除

播放的录音是通过电脑的音响放给手机么

请问一下,是怎么把音频传到手机的,在手机上点击录音的时候,怎么拾音?

怎么用 Python 对 APP 实现自动语音输入 中提及了此贴 12月05日 12:20

这个思路好新奇,我目前需要用 appium 测试 APP 中的语音录制功能,楼主的方法给了我启发。

陈子昂 回复

请问第三方是用的什么,我不想用楼主这种 PC 播放的方式,能不能直接手机上播放或者插入一段语音直接提交发送出去

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册