Demo
官网
首发于 简书
最近突发兴趣,想了解点测试方面的内容,同时自己又属于比较懒的,所以期望可以做成自动化测试,写个脚本自动运行,在版本迭代后做回归测试会比较方便,另外,我期望测试框架可以根据id等属性来定位控件,而不是如monkeyRunner那样通过坐标来定位,以便于测试不同机型,找了几个框架后最后决定先试试appium, 因此就有了这篇文章;
基于:
系统: win10 64
Appium: AppiumForWindows_1_4_16_1
脚本: python 3.5
就是运行有点慢啊…
好像没看到直接截图对比功能,不过可以考虑使用现成的monkeyRunner的,没测试过…
网上文章应该蛮多的,据说安装比较复杂,我因为之前开发的时候安装过androidSDK,python,node,framework4.5等等,所以一路都还挺顺利,安装过程:
1. 在系统环境变量中配置 ANDROID_HOME
变量
2. 安装python并添加到path环境变量中
3. 安装node(非必需)
4. 下载appium 并安装,推荐1.4.0以后的版本
5. 安装appium客户端:
pip install robotframework-appiumlibrary
# -*- codeing: utf-8 -*-
# 这个最好还是养成习惯,之前使用monkeyRunner的时候就是没设置utf-8,运行的时候连注释中的中文都报错
# 导入所需包
import sys,os,unittest
from time import sleep
from appium import webdriver
'''
python 3.5
测试机型: 红米1s android 4.4.4
直接运行脚本即可
'''
desire_caps = {}
desire_caps['platformName'] = 'Android'
desire_caps['platformVersion'] = '4.4.4'
desire_caps['appPackage'] ='com.android.contacts'
desire_caps['appActivity'] = '.activities.PeopleActivity'
# 手机名称,这个可以通过命令行adb devices即可获取,我发现在连接多台手机时会有影响
desire_caps['deviceName'] = '9de1f8c7'
# 以下两项主要是在点击输入框的时候,会触发系统输入法,导致可能我们发送的是字符 `234`,但是九宫格中文输入法有可能给出的是 `bei` ,这两个属性就是屏蔽系统输入法,使用appium自己的,但是测试完成后,得自己去系统设置中将输入法切换过来
desire_caps['unicodeKeyboard'] = True
desire_caps['resetKeyboard'] = True
# ip地址在pc上的 appium客户端-设置 中可以看到 `server address` 和 `port`,保持一致即可
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desire_caps)
# 通过id查找控件
# 具体的控件id可以通过 `AndroidSDK\tools\uiautomatorviewer.bat` 来直接获取
createContactBtn = driver.find_element_by_id('com.android.contacts:id/fab')
# 模拟点击操作
createContactBtn.click()
# 也可以通过文本查找控件,并输入姓名
name = driver.find_element_by_name(u"姓名") # "姓名" 是输入框的hint值
name.click()
name.send_keys("阿冏Lynxz") # 输入指定的文本,注意这里需要上面desire_caps屏蔽系统输入法才行
# 也可以查找多个控件
# 比如通讯录可能有多个电话号码输入框 `elements` 多了个s
phone = driver.find_elements_by_name(u"电话")
phone[0].click()
phone[0].send_keys("189***0620")
# 判断结果是否符合预期,不通过的话会在这里中断并打印日志
# self.assertEqual(phone[0].text,"15390")
# 截屏,会在当前目录保存指定文件名的图片
driver.save_screenshot("after_input.png")
# 等待,单位:秒
sleep(5)
# 测试完成,退出
driver.quit()
控件属性/操作方法:
* text
控件显示的文本信息,如 edt.text,有点类似于属性获取
* click()
模拟控件点击操作,如btn.click
* clear()
清除控件的文本
* is_enabled()
判断控件是否可用
* is_selected()
控件是否被选中
* is_displayed()
控件是否显示
* get_attribute(self,name)
指定属性名称,返回属性值,若属性名不存在,则返回none
* send_keys(self,*value)
模拟输入文本到控件
系统API
* current_activity
获取当前activity信息,可以直接打印,如 print(driver.current_activity)
* current_context
\ context
我在真机上测试的时候都是返回 NATIVE_APP
* install_app(self,app_path)
安装应用app
* is_app_installed(self,bundle_id)
在android中传入包名即可
* get_screenshot_as_file(self,filename)
传入要保存的路径和文件名,可以使用相对路径
* save_screenshot(self,filename)
跟上一条的功能类似
* network_connection
查看当前网络信息,整数值, ==!测试出来都是1
selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"])
修改 Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js
文件
this.shell("ps '" + name + "'", function (err, stdout) {
...
var procs = [];
var outlines = stdout.split("\n");
outlines.shift() //添加这行
...
保存后,重新运行appium即可
好吧,这个是我电脑上开着 s,虽然是pac模式,但是appium就是会报错,关闭就好了
send_keys()
时会触发输入法,导致输入异常,中文无法输入Python Appium实现中文输入分享
解决方法: 在 desire caps
参数中添加如下两个字段:
desire_caps = {}
...
desire_caps['unicodeKeyboard'] = True # 使用unicodeKeyboard的编码方式来发送字符串
desire_caps['resetKeyboard'] = True # 将键盘给隐藏起来
当然,这样测试结束后,发现自己输入法调用不出来,可以到系统设置中切换一些输入法(此时,默认调用的是Appium Android Input manager...
)