【Appnium学习】AppiumApi接口和二次开发
Appium 初始化配置信息(Desired Capabilities)
Desired Capabilities实际上就是一个字典,它主要用于向Appium Server提供初始化配置参数,如:想要测试的系统是Android还是IOS,测试哪款软件,软件的入口是哪里等。
from appium import webdriver # 存放连接手机app初始化的一些信息 desc = {} # 手机唯一标识:通过(adb devices命令查看) desc[‘deviceName‘] = ‘emulator-5554‘ # 手机上操作系统版本 desc[‘platformVersion‘] = ‘5.1.1‘ # 测试手机的系统 desc[‘platformName‘] = ‘Android‘ # 包名 desc[‘appPackage‘] = ‘com.tencent.mobileqq‘ # 入口 desc[‘appActivity‘] = ‘com.tencent.mobileqq.activity.SplashActivity‘ # appium的输入法,支持中文 desc["unicodeKeyboard"] = "True" # 程序结束之后重置输入法 desc["resetKeyboard"] = "True" # 不初始化app(不会清除app的数据包括缓存数据) desc["noReset"] = "True" driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘,desc)
也可以这么写
from appium import webdriver # 存放连接手机app初始化的一些信息 desc = {‘deviceName‘:‘emulator-5554‘, # 手机唯一标识:通过(adb devices命令查看) ‘platformVersion‘:‘5.1.1‘, # 手机上操作系统版本 ‘platformName‘:‘Android‘, # 测试手机的系统 ‘appPackage‘:‘com.tencent.mobileqq‘, # 包名 ‘appActivity‘:‘com.tencent.mobileqq.activity.SplashActivity‘, # 入口 ‘unicodeKeyboard‘:‘True‘, # appium的输入法,支持中文 ‘resetKeyboard‘:‘True‘, # 程序结束之后重置输入法 ‘noReset‘:‘True‘} # 不初始化app(不会清除app的数据包括缓存数据) 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
# 返回是否安装了对应包名的App True 或者 False driver.is_app_installed(‘com.tencent.mobileqq‘) # 关闭初始化信息中的App driver.close_app() # 启动初始化信息中的App driver.launch_app() # 安装app 参数为软件的绝对路径 driver.install_app(r‘C:\Users\bjhouyafan\Desktop\tester\appUi\wecash.apk‘) # 卸载app 参数接收appPackageName driver.remove_app(‘com.tencent.mobileqq‘) # 获取当前打开的app的入口名 driver.current_activity # 启动某一个包的,某一个入口 # 参数接受appPackage,appActivity # 可以省略多个步骤直接到达某个入口,即指定测试的位置,可以通过driver.current_activity获取 driver.start_activity(‘com.tencent.mobileqq‘,‘.activity.RegisterPhoneNumActivity‘) # 还可以关闭初始化app后打开另外一个app driver.close_app() driver.start_activity(‘com.android.browser‘, ‘.BrowserActivity‘) # 每隔0.5秒判断一次当前的app名称是否是activityName,5秒后超时 # WebDriverWait driver.wait_activity(‘activityName‘, 5, 0.5) # 将启动的app退出到后台,多少秒后在切回app driver.background_app(‘m‘) # 清除应用数据缓存,相当于卸载重装 driver.reset()
滑动、拖拽及多点触控操作
from appium import webdriver # 存放连接手机app初始化的一些信息 desc = {} # 手机唯一标识:通过(adb devices命令查看) desc[‘deviceName‘] = ‘emulator-5554‘ # 手机上操作系统版本 desc[‘platformVersion‘] = ‘5.1.1‘ # 测试手机的系统 desc[‘platformName‘] = ‘Android‘ # 包名:通过(aapt dump badging apk全路径)获取 # package: name=‘com.tencent.mobileqq‘ desc[‘appPackage‘] = ‘com.android.settings‘ # 入口:通过(aapt dump badging apk全路径)获取 # launchable-activity: name=‘com.tencent.mobileqq.activity.SplashActivity‘ desc[‘appActivity‘] = ‘.Settings‘ # appium的输入法,支持中文 desc["unicodeKeyboard"] = "True" # 程序结束之后重置输入法 desc["resetKeyboard"] = "True" # 不初始化app(不会清除app的数据包括缓存数据) desc["noReset"] = "True" driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘,desc) # 滚动处理 # 底层通过action操作,origin_el为目标元素,destination_el为起始元素 # 通过模拟手势可以看出 从下面的元素移动到上面的元素 # action.press(origin_el).move_to(destination_el).release().perform() # driver.scroll(origin_el, destination_el) origin_el = driver.find_element_by_xpath("//android.widget.TextView[@text=‘蓝牙‘]") destination_el = driver.find_element_by_xpath("//android.widget.TextView[@text=‘提示音和通知‘]") driver.scroll(origin_el,destination_el) # 通过坐标实现滑屏操作 # 从手机的左上角开始,横坐标为x轴,纵坐标为y # 分辨率不同,坐标不相同,所以需要根据屏幕的大小做比例运算 # driver.swipe(start_x,start_y,end_x,end_y,duration=None) size = driver.get_window_size() # 获取手机大小即分辨率,返回的是一个字典 # {‘width‘: 1080, ‘height‘: 1920} height = size.get(‘height‘) width = size.get(‘width‘) # 以左上角为基准,x轴往下,y轴往右 # 通过百分比的方式定位起始位置和结束位置 # 起始位置 start_x = width * 0.5 start_y = height * 0.99 # 结束位置 end_x = width * 0.5 end_y = height * 0.2 # 滑动滚动条 driver.swipe(start_x,start_y,end_x,end_y,500) # 拖拽 # origin_el源元素,destination_el目标元素 # 通过long_press实现 # action.long_press(origin_el).move_to(destination_el).release().perform() driver.drag_and_drop(origin_el,destination_el) # 多点触控 模拟手指点击 # tap模拟按住坐标多少秒,[(x,y)] 多个坐标则写多个元祖。第二个参数为按住多长时间。单位为毫秒(ms) driver.tap([(100,20),(100,60),(100,100)],500)
NATIVE_APP 与 WEBVIEW 上下文操作
from appium import webdriver import time # 存放连接手机app初始化的一些信息 desc = {} # 手机唯一标识:通过(adb devices命令查看) desc[‘deviceName‘] = ‘emulator-5554‘ # 手机上Android版本 desc[‘platformVersion‘] = ‘5.1.1‘ # 测试手机的系统 desc[‘platformName‘] = ‘Android‘ # 包名:通过(adb logcat | findstr /i start)获取 # Start proc 24263:com.android.browser/u0a11 for activity com.android.browser/.BrowserActivity desc[‘appPackage‘] = ‘com.android.browser‘ # 入口:通过(adb logcat | findstr /i start)获取 # Start proc 24263:com.android.browser/u0a11 for activity com.android.browser/.BrowserActivity desc[‘appActivity‘] = ‘.BrowserActivity‘ # appium的输入法,支持中文 desc["unicodeKeyboard"] = "True" # 程序结束之后重置输入法 desc["resetKeyboard"] = "True" # 不初始化app(不会清除app的数据包括缓存数据) desc["noReset"] = "True" driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘,desc) # 定位url输入框 element = driver.find_element_by_id(‘com.android.browser:id/url‘) # 输入新网址 driver.set_value(element,‘http://ui.imdsx.cn/uitester/‘) time.sleep(2) # keycode:Android按键码,66代表回车键 driver.press_keycode(66) time.sleep(2) # 获取app的所有类型,有WEBVIEW的则以list的形式展示两个 print(driver.contexts) # 获取当前session中的app类型 print(driver.current_context) # 切换前为原生app:NATIVE_APP # 从原生app切换到H5 driver.switch_to.context(driver.contexts[1]) # 定位id为i1的元素 driver.find_element_by_css_selector(‘#i1‘).send_keys(‘大师兄‘) # 获取切换后的app类型 print(driver.current_context) # 切换后为H5app:WEBVIEW_com.android.browser # 再从H5切换回原生app driver.switch_to.context(driver.contexts[0])
KeyCode操作
# 隐藏键盘 driver.hide_keyboard() # 发送按键码,仅按一下,与press_keycode相同 # 可接收str或int的code码 driver.keyevent(3) # 发送按键码,仅按一下,可接收str或int的code码 driver.press_keycode(24) # 发送一个长按的按键码,接收参数必须是int的code码 driver.long_press_keycode(25)
网络
# 返回当前手机的网络状态 driver.network_connection # 导入 from appium.webdriver.connectiontype import ConnectionType # WIFI ConnectionType.WIFI_ONLY # 数据流量 ConnectionType.DATA_ONLY # 飞行模式 ConnectionType.AIRPLANE_MODE # 无网络模式 ConnectionType.NO_CONNECTION # 全部都打开 ConnectionType.ALL_NETWORK_ON # 设置 网络 driver.set_network_connection(ConnectionType.AIRPLANE_MODE)
操作输入法
# 返回Android上可用的输入法 driver.available_ime_engines # 返回当前输入法的包名 driver.active_ime_engine # 是否启动了输入法 True or False driver.is_ime_active() # 切换输入法 参数接收available_ime_engines中任意一个输入法包名 driver.activate_ime_engine(driver.available_ime_engines[0]) # 关闭当前输入法 driver.deactivate_ime_engine()
其他
# 锁定手机多少秒 仅IOS driver.lock() # 摇手机 driver.shake() # 打开通知栏 仅Android driver.open_notifications() # 获取连接手机的当前时间 driver.device_time # 开启或关闭手机定位服务 driver.toggle_location_services()
相关推荐
歆萌 2020-08-03
歆萌 2020-07-05
无缘公子 2020-06-18
xjp 2020-08-03
lucialee 2020-07-18
maowenbei 2020-07-04
QCkiss 2020-06-21
xhpscdx 2020-06-16
freerocker 2020-06-16
ZoctopusD 2020-06-14
lucialee 2020-06-13
freerocker 2020-06-12
xhpscdx 2020-06-12
RocketJ 2020-06-11
chichichi0 2020-06-10
Dipa 2020-06-09
dangai00 2020-06-06