使用appium+python对android进行自动化测试
测试环境搭建
需要用到的软件如下:
1. jdk-8u121-window(32位的就下载32位的,64位的就下载64位的)。
2.Android-sdk_r24.3.4-windows(下载这个adt-bundle-windows-x86-20140624)
3.Python:(V3.6也可以)
4.appium:1.4.13.1
5.Node.js:node-v4.4.7-x64
6.Appium-python-Client
一、其中1-5是可以先下载的,6则需要在完成前面的五个步骤后才进行。
下载好jdk直接点下一步就可以了,然后开始配置变量,参考如下路径:http://jingyan.baidu.com/article/d45ad148ba5ab169552b80d3.html 注意.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;是有“.”这个符号的不能漏掉
按快捷键win+r,在运行内输入cmd,并输入Java,回车,如果出来的是这些中文,那说明这是正确的,在接下来输入javac,回车,如果出现这些中文,说明是环境变量配好了。
二、下载这个adt-bundle-windows-x86-20140624
下载好后并进行解压,然后开始配置三个变量:
1.解压adt集成包到合适的路径下面,比如D:\adt\
2.设置安卓环境变量
配置环境变量,
设置ANDROID_HOME系统变量为你的android SDK路径,并把tools和platform-tools两个目录加入到系统的Path路径里。
eg:添加变量名:ANDROID_HOME 变量值: D:\adt\sdk
并把这句添加到 %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools记得要加上";"
配置完环境后,可以在运行cmd后输入 adb(能看到当前版本号)再输入android-h(如果出来一堆文字则是可以的)
三安装python
进入官网或百度下载python下载好后安装到所需安装路径,如在D盘中新建一个python文件夹,如d:\python34
安装完成后将D:\python和D:\python\Scripts,添加到环境变量path下
打开cmd输入python,出现版本号,然后输入print("helloworld!")这样python就是安装好了。
四、安装node.js
进入官网地址并下载:https://nodejs.org/en/download/
下载后一路傻瓜式安装,安装完成后,运行cmd,输入node –v查看版本号,然后输入npm
五、安装appium
进入官网地址并下载
https://bitbucket.org/appium/appium.app/downloads/
下载后一路傻瓜式安装即可。
appium安装好后,找到这个文件目录D:\appium\Appium\node_modules\.bin
2.将上面的地址添加到环境变量path下
3.打卡cmd,输入appium-doctor,检查环境是否OK,出现allchecks were successful,说明环境OK
六、安装Appium-Python-Client
进入cmd 输入:pip install Appium-Python-Client。等待安装完成。
Python集成开发环境PyCharm安装
安装流程参考:http://www.jianshu.com/p/042324342bf4
需要激活可以购买正版或网上搜索激活码。
简单自动化测试用例编写
一、使用pycharm创建python项目
选择 pure python项目并选择项目存放目录
二、在项目中新建unittest文件
右击项目—New—Python File
选择python unit test并输入文件名
三、对unittest补充setup及teardown函数
对类MyTestCase添加setUp函数(这是测试用例执行前的准备动作,负责告诉appium监听那个端口、与那个手机连接、安装那个应用等信息)
对类MyTestCase添加TearDown函数(这是测试用例执行结束后的动作,可以执行保存执行结果等操作)
四、在test_something中编写测试用例
循环10次执行登录操作
运行测试用例
一、打开android虚拟机或者连接真机
打开虚拟机(用到虚拟机的一定是开发人员了,不会开就gg吧)或者连接真机(真机需要开启调试模式)
二、打开并运行appium
点击android图标配置信息(这里的信息其实在我们的用例编写时setUp就已经配置过,不过在setUp中的配置可能出现无效的情况,这里就可以根据需要自己配置)
点击设置图标
1、 可以对里边的server地址端口进行修改。
2、 当session不一致时实行覆盖。
3、 输出log文件方便查看执行的过程及结果。
点击运行图标,当现实info:Console logLeveL :debug是代表成功运行(此时appium已经与android设备建立连接,当执行用例时就可以通过appium向android设备发送命令了)
三、运行测试用例
完成上述几步后,开始运行测试用例
在python集成开发环境中点击运行按钮(当按钮无效时可能需要选择运行的文件或配置运行设置)
四、根据报错信息修改测试用例
1、运行时可能出现页面元素无法找到等问题,可以换一种元素的查找方式
2、另外休眠时间也需要注意,避免页面还未加载时执行页面元素的点击等操作
五、查看页面元素
Appium有自带的页面元素的查看工具
点击搜索图标—点击刷新(appium的运行按钮与android设备必须为开启状态)
其他的界面元素查看工具:UI AutomatorViewer(在android sdk 的tools的bin文件夹下)
Appium运行原理
测试用例中用到的api
打印上下文
driver.contexts
打印当前上下文
driver.context
driver.current_context
切换上下文
driver.switch_to.context('WEBVIEW')
打印页面元素
driver.page_source
获取元素text属性
element.get_attribute('text') Android使用(获取元素的text值)
element.text iOS使用(获取元素的value值)
定位
driver.find_element_by_ios_uiautomation(uia_string)
driver.find_elements_by_ios_uiautomation(uia_string)
driver.find_element_by_android_uiautomator(uia_string)
driver.find_elements_by_android_uiautomator(uia_string)
例:driver.find_element_by_android_uiautomator('newUiSelector().text("竞彩篮球")')
driver.find_element_by_accessibility_id(id)(此方法使用的是元素的content-des属性)
driver.find_elements_by_accessibility_id(id)
driver.find_element_by_id(id)
driver.find_elements_by_id(id)(获取的为元素集合使用*[Num]获取子元素)
driver.find_element_by_xpath(xpath)
(
因为webdriver没有xpath全部的库所有只支持两种格式
1、 self.driver.find_element_by_xpath("//android.widget.EditText[@content-desc='请输入登录密码']")
2、 self.driver.find_element_by_xpath("//android.widget.ListView/android.widget.EditText")
)
driver.find_elements_by_xpath(xpath)
driver.find_element_by_name(name)
driver.find_elements_by_name(name)
driver.find_element_by_class_name(class)
driver.find_elements_by_class_name(class)
driver.find_element(by,value)
by:"id"、"xpath"、"classname"、 "name"、'-ios uiautomation'、'-android uiautomator'、'accessibility id'
坐标点击
driver.tap([(x,y)],time)
滑动
driver.swipe(x1,y1,x2,y2,time)
driver.flick(x1,y1,x2,y2)
输入
driver.send_keys()
driver.set_text() Android可用
driver.set_value() iOS可用
如果使用sendkeys不行,可以尝试下面两种方法,我在测试ios输入密码框是自定义的键盘时,用sendkeys输入不了,appium服务端log提示没找到keyboard,后面尝试setvalue可以输入。
截图
driver.get_screenshot_as_file(filename)
获取手机屏幕分辨率
driver.get_window_size()
x =driver.get_window_size()['width']
y = driver.get_window_size()['height']
设置屏幕分辨率
driver.set_window_size(width,height)
获取当前坐标位置
driver.get_window_position()
滚动
driver.scroll(ele1,ele2)
按住element并拖动到另外一个element上
driver.drag_and_drop(ele1,ele2)
缩小
driver.pinch(ele)
放大
driver.zoom(ele)
重启app
driver.reset()
隐藏键盘
driver.hide_keyboard()
发送键盘事件
driver.keyevent(keycode)
按住键盘
driver.press_keycode(keycode)
长按住键盘
driver.long_press_keycode(keycode)
上传文件
driver.push_file(path)
下载文件
driver.pull_file(path)
下载文件夹
driver.pull_folder(path)
app隐藏后台
driver.background_app(time)
安装app
driver.install_app(path)
卸载app
driver.remove_app(app_id)
启动app
driver.launch_app()
关闭app
driver.close_app()
启动activity
driver.start_activity(app_package,app_activity)
打印当前activity
driver.current_activity
锁屏
driver.lock(time)
振动
driver.shake()
打开通知栏(api 18以上)
driver.open_notifications()
获取网络
driver.network_connection
设置网络连接( android only.)
driver.set_network_connection(type)
Value (Alias) |Data | Wifi | Airplane Mode
-------------------------------------------------
0 (None) | 0 | 0 | 0
1 (Airplane Mode) | 0 | 0 | 1
2 (Wifi only) | 0 | 1 | 0
4 (Data only) | 1 | 0 | 0
6 (All network on) | 1 | 1 | 0
type参数:
NO_CONNECTION =0
AIRPLANE_MODE = 1
WIFI_ONLY = 2
DATA_ONLY = 4
ALL_NETWORK_ON = 6
例
fromappium.webdriver.connectiontype import ConnectionType
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)
获取手机输入法(返回list)
driver.available_ime_engines
激活某种输入法
driver.activate_ime_engine(engine)
判断输入法是否激活(返回bool)
driver.is_ime_active()
撤销当前输入法(Android only)
driver.deactivate_ime_engine()
得到当前设置
driver.get_settings()
返回{u'ignoreUnimportantViews': False}
更新当前设置
driver.update_settings(settings)
settings参数为dict,如{ignoreUnimportantViews: True}
ignoreUnimportantViews参数:调用 uiautomator的函数setCompressedLayoutHierarchy()。由于 Accessibility命令在忽略部分元素的情况下执行速度会加快,这个关键字能加快测试执行的速度。被忽略的元素将不能够被找到,因此这个关键字同时也被实现成可以随时改变的 *设置 (settings ) *。默认值 false
开关定位服务
driver.toggle_location_services()
————————————————
原文链接:https://blog.csdn.net/duoluo9/article/details/77053815