• 【Appium总结】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:UsersjhouyafanDesktop	esterappUiwecash.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()
    作者:gtea 博客地址:https://www.cnblogs.com/gtea
  • 相关阅读:
    HDU1058Humble Numbers(DP)
    HDU1285确定比赛名次(拓扑排序)
    HDU2602Bone Collector(DP,0/1背包)
    HDU1869六度分离(最短路floyd)
    HDU3342Legal or Not(拓扑)
    Dijkstra不能得到含有负权边图的单源最短路径
    HDU1069Monkey and Banana(DP)
    HDU1176免费馅饼(DP)
    DAG上的动态规划
    网络分析中数据包结构的定义
  • 原文地址:https://www.cnblogs.com/gtea/p/12715877.html
Copyright © 2020-2023  润新知