Appnium学习AppiumApi接口和二次开发
Posted Gtea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Appnium学习AppiumApi接口和二次开发相关的知识,希望对你有一定的参考价值。
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(r\'C:\\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()
以上是关于Appnium学习AppiumApi接口和二次开发的主要内容,如果未能解决你的问题,请参考以下文章