码迷,mamicode.com
首页 > 移动开发 > 详细

移动端自动化==>AppiumApi接口详解

时间:2018-07-27 01:10:25      阅读:864      评论:0      收藏:0      [点我收藏+]

标签:nbsp   xpath   form   ack   当前时间   div   手机定位   后台   only   

Appium 初始化配置信息(Desired Capabilities)

Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要测试的系统是Android还是IOS,测试哪款软件,软件的入口是哪里等。

 1 from appium import webdriver
 2 # 存放连接手机app初始化的一些信息
 3 desc = {}
 4 # 手机唯一标识:通过(adb devices命令查看)
 5 desc[deviceName] = emulator-5554
 6 # 手机上操作系统版本
 7 desc[platformVersion] = 5.1.1
 8 # 测试手机的系统
 9 desc[platformName] = Android
10 # 包名
11 desc[appPackage] = com.tencent.mobileqq
12 # 入口
13 desc[appActivity] = com.tencent.mobileqq.activity.SplashActivity
14 # appium的输入法,支持中文
15 desc["unicodeKeyboard"] = "True"
16 # 程序结束之后重置输入法
17 desc["resetKeyboard"] = "True"
18 # 不初始化app(不会清除app的数据包括缓存数据)
19 desc["noReset"] = "True"
20 driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub,desc)

也可以这么写

 1 from appium import webdriver
 2 # 存放连接手机app初始化的一些信息
 3 desc = {deviceName:emulator-5554,  # 手机唯一标识:通过(adb devices命令查看)
 4         platformVersion:5.1.1,     # 手机上操作系统版本
 5         platformName:Android,      # 测试手机的系统
 6         appPackage:com.tencent.mobileqq,  # 包名
 7         appActivity:com.tencent.mobileqq.activity.SplashActivity,  # 入口
 8         unicodeKeyboard:True,      # appium的输入法,支持中文
 9         resetKeyboard:True,        # 程序结束之后重置输入法
10         noReset:True}              # 不初始化app(不会清除app的数据包括缓存数据)
11 driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub,desc)

定位Android的appPackage与appActivity的方法

方法一:

在cmd下输入命令:aapt dump badging +apk全路径获取appPackage与appActivity,如下图:

技术分享图片

技术分享图片

方法二:

通过监控adb操作日志来找到appPackage与appActivity,CMD下输入adb logcat | findstr /i start,在手机上强制停止被测试软件,再次打开,观察logcat。

技术分享图片

斜杠左边为appPackage,斜杠右边为appActivity。(logcat的日志较多,要找点击时第一个Start proc的日志。)但是,这种查看日志的方式比较不方便,日志一多起来,不太好找。所以建议使用方法一来确定appPackage和appActivity。

操作APP

 1 # 返回是否安装了对应包名的App True 或者 False
 2 driver.is_app_installed(com.tencent.mobileqq)
 3 
 4 # 关闭初始化信息中的App
 5 driver.close_app()
 6 
 7 # 启动初始化信息中的App
 8 driver.launch_app()
 9 
10 # 安装app 参数为软件的绝对路径
11 driver.install_app(rC:\Users\bjhouyafan\Desktop\tester\appUi\wecash.apk)
12 
13 # 卸载app 参数接收appPackageName
14 driver.remove_app(com.tencent.mobileqq)
15 
16 # 获取当前打开的app的入口名
17 driver.current_activity
18 
19 # 启动某一个包的,某一个入口
20 # 参数接受appPackage,appActivity
21 # 可以省略多个步骤直接到达某个入口,即指定测试的位置,可以通过driver.current_activity获取
22 driver.start_activity(com.tencent.mobileqq,.activity.RegisterPhoneNumActivity)
23 # 还可以关闭初始化app后打开另外一个app
24 driver.close_app()
25 driver.start_activity(com.android.browser, .BrowserActivity)
26 
27 # 每隔0.5秒判断一次当前的app名称是否是activityName,5秒后超时
28 # WebDriverWait
29 driver.wait_activity(activityName, 5, 0.5)
30 
31 # 将启动的app退出到后台,多少秒后在切回app
32 driver.background_app(m)
33 
34 # 清除应用数据缓存,相当于卸载重装
35 driver.reset()

 滑动、拖拽及多点触控操作

 1 from appium import webdriver
 2 # 存放连接手机app初始化的一些信息
 3 desc = {}
 4 # 手机唯一标识:通过(adb devices命令查看)
 5 desc[deviceName] = emulator-5554
 6 # 手机上操作系统版本
 7 desc[platformVersion] = 5.1.1
 8 # 测试手机的系统
 9 desc[platformName] = Android
10 # 包名:通过(aapt dump badging apk全路径)获取
11 # package: name=‘com.tencent.mobileqq‘
12 desc[appPackage] = com.android.settings
13 # 入口:通过(aapt dump badging apk全路径)获取
14 # launchable-activity: name=‘com.tencent.mobileqq.activity.SplashActivity‘
15 desc[appActivity] = .Settings
16 # appium的输入法,支持中文
17 desc["unicodeKeyboard"] = "True"
18 # 程序结束之后重置输入法
19 desc["resetKeyboard"] = "True"
20 # 不初始化app(不会清除app的数据包括缓存数据)
21 desc["noReset"] = "True"
22 driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub,desc)
23 
24 # 滚动处理
25 # 底层通过action操作,origin_el为目标元素,destination_el为起始元素
26 # 通过模拟手势可以看出 从下面的元素移动到上面的元素
27 # action.press(origin_el).move_to(destination_el).release().perform()
28 # driver.scroll(origin_el, destination_el)
29 origin_el = driver.find_element_by_xpath("//android.widget.TextView[@text=‘蓝牙‘]")
30 destination_el = driver.find_element_by_xpath("//android.widget.TextView[@text=‘提示音和通知‘]")
31 driver.scroll(origin_el,destination_el)
32 
33 # 通过坐标实现滑屏操作
34 # 从手机的左上角开始,横坐标为x轴,纵坐标为y
35 # 分辨率不同,坐标不相同,所以需要根据屏幕的大小做比例运算
36 # driver.swipe(start_x,start_y,end_x,end_y,duration=None)
37 size = driver.get_window_size()   # 获取手机大小即分辨率,返回的是一个字典
38 # {‘width‘: 1080, ‘height‘: 1920}
39 height = size.get(height)
40 width = size.get(width)
41 # 以左上角为基准,x轴往下,y轴往右
42 # 通过百分比的方式定位起始位置和结束位置
43 # 起始位置
44 start_x = width * 0.5
45 start_y = height * 0.99
46 # 结束位置
47 end_x = width * 0.5
48 end_y = height * 0.2
49 # 滑动滚动条
50 driver.swipe(start_x,start_y,end_x,end_y,500)
51 
52 # 拖拽
53 # origin_el源元素,destination_el目标元素
54 # 通过long_press实现
55 # action.long_press(origin_el).move_to(destination_el).release().perform()
56 driver.drag_and_drop(origin_el,destination_el)
57 
58 # 多点触控 模拟手指点击
59 # tap模拟按住坐标多少秒,[(x,y)] 多个坐标则写多个元祖。第二个参数为按住多长时间。单位为毫秒(ms)
60 driver.tap([(100,20),(100,60),(100,100)],500)

NATIVE_APP 与 WEBVIEW 上下文操作

 1 from appium import webdriver
 2 import time
 3 # 存放连接手机app初始化的一些信息
 4 desc = {}
 5 # 手机唯一标识:通过(adb devices命令查看)
 6 desc[deviceName] = emulator-5554
 7 # 手机上Android版本
 8 desc[platformVersion] = 5.1.1
 9 # 测试手机的系统
10 desc[platformName] = Android
11 # 包名:通过(adb logcat | findstr /i start)获取
12 # Start proc 24263:com.android.browser/u0a11 for activity com.android.browser/.BrowserActivity
13 desc[appPackage] = com.android.browser
14 # 入口:通过(adb logcat | findstr /i start)获取
15 # Start proc 24263:com.android.browser/u0a11 for activity com.android.browser/.BrowserActivity
16 desc[appActivity] = .BrowserActivity
17 # appium的输入法,支持中文
18 desc["unicodeKeyboard"] = "True"
19 # 程序结束之后重置输入法
20 desc["resetKeyboard"] = "True"
21 # 不初始化app(不会清除app的数据包括缓存数据)
22 desc["noReset"] = "True"
23 driver = webdriver.Remote(http://127.0.0.1:4723/wd/hub,desc)
24 
25 # 定位url输入框
26 element = driver.find_element_by_id(com.android.browser:id/url)
27 # 输入新网址
28 driver.set_value(element,http://ui.imdsx.cn/uitester/)
29 time.sleep(2)
30 # keycode:Android按键码,66代表回车键
31 driver.press_keycode(66)
32 time.sleep(2)
33 
34 # 获取app的所有类型,有WEBVIEW的则以list的形式展示两个
35 print(driver.contexts)
36 # 获取当前session中的app类型
37 print(driver.current_context)  # 切换前为原生app:NATIVE_APP
38 # 从原生app切换到H5
39 driver.switch_to.context(driver.contexts[1])
40 # 定位id为i1的元素
41 driver.find_element_by_css_selector(#i1).send_keys(大师兄)
42 # 获取切换后的app类型
43 print(driver.current_context)  # 切换后为H5app:WEBVIEW_com.android.browser
44 # 再从H5切换回原生app
45 driver.switch_to.context(driver.contexts[0])

KeyCode操作

 1 # 隐藏键盘
 2 driver.hide_keyboard()
 3  
 4 # 发送按键码,仅按一下,与press_keycode相同
 5 # 可接收str或int的code码
 6 driver.keyevent(3)
 7  
 8 # 发送按键码,仅按一下,可接收str或int的code码
 9 driver.press_keycode(24)
10  
11 # 发送一个长按的按键码,接收参数必须是int的code码
12 driver.long_press_keycode(25)

网络

 1 # 返回当前手机的网络状态
 2 driver.network_connection
 3  
 4 # 导入
 5 from appium.webdriver.connectiontype import ConnectionType
 6  
 7 # WIFI
 8 ConnectionType.WIFI_ONLY
 9  
10 # 数据流量
11 ConnectionType.DATA_ONLY
12  
13 # 飞行模式
14 ConnectionType.AIRPLANE_MODE
15  
16 # 无网络模式
17 ConnectionType.NO_CONNECTION
18  
19 # 全部都打开
20 ConnectionType.ALL_NETWORK_ON
21  
22 # 设置 网络
23 driver.set_network_connection(ConnectionType.AIRPLANE_MODE)

操作输入法

 1 # 返回Android上可用的输入法
 2 driver.available_ime_engines
 3  
 4 # 返回当前输入法的包名
 5 driver.active_ime_engine
 6  
 7 # 是否启动了输入法 True or False
 8 driver.is_ime_active()
 9  
10 # 切换输入法 参数接收available_ime_engines中任意一个输入法包名
11 driver.activate_ime_engine(driver.available_ime_engines[0])
12  
13 # 关闭当前输入法
14 driver.deactivate_ime_engine()

其他

 1 # 锁定手机多少秒 仅IOS
 2 driver.lock()
 3  
 4 # 摇手机
 5 driver.shake()
 6  
 7 # 打开通知栏 仅Android
 8 driver.open_notifications()
 9  
10 # 获取连接手机的当前时间
11 driver.device_time
12  
13 # 开启或关闭手机定位服务
14 driver.toggle_location_services()

 

移动端自动化==>AppiumApi接口详解

标签:nbsp   xpath   form   ack   当前时间   div   手机定位   后台   only   

原文地址:https://www.cnblogs.com/L-Test/p/9371131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!