使用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

上一篇:了解selenium ,appium


下一篇:Appium自动化(15):Appium常用操作之混合应用webview页面操作--待补充!