zoukankan      html  css  js  c++  java
  • 移动端自动化测试-AppiumApi接口详解

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

    这种服务关键字在网上很多,百度搜一下就有一大堆了。

    定位Android的appPackage与appActivity-Windows操作系统方法

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

     

    斜杠之前为appPackage,斜杠之后为appActivity。从此想抓那个App,就抓那个App。(logcat的日志较多,要找点击时第一个Start proc的日志。)

    这种查看日志的方式比较不方便,日志一多起来,眼睛一乱什么也找不到了。所以可以使用SDK中的aapt进行抓取

    SDK中下载最新的build-tools,通过aapt dump badging xxx.apk命令来查appPackage与appActivity。

    包名:

    入口:

     下列代码可以打开手机QQ:

    from appium import webdriver
    
    des = {
           'resetKeyboard': True,
           'platformVersion': '6.0.1',
           'noReset': True, # 不将app初始化
           'appActivity': 'com.tencent.mobileqq.activity.SplashActivity',
           # 'appActivity': '.BrowserActivity',
           'appPackage': 'com.tencent.mobileqq',
           # 'appPackage': 'com.android.browser',
           'unicodeKeyboard': True,
           'deviceName': '1afd95f92',
           'platformName': 'Android'}
    # print(des)
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

    获取元素系列

    # Android对应content-desc IOS对应accessibility identifier
    # content-desc是给残障人士定义的特殊字段
    driver.find_element_by_accessibility_id('content-desc')
     
    # ID定位于selenium不同,可能存在重复的问题。
    # appium-desktop抓取元素时如果出现有id,则可以直接用。
    # resource-id可能出现重复,需要具体看下有多少个。
    driver.find_element_by_id('resource-id')
     
    # 对应class字段,有可能存在多个相同class。
    # 多个相同class,每次获取只取第一个遇到的元素。
    driver.find_element_by_class_name('class')
     
    # Xpath路径定位,与Web的Xpath定位在有一点点区别
    # Native App的定位以class为基准,主要用到参数有text、resource-id、index
    driver.find_element_by_xpath('//android.widget.EditText[@text="手机号"]')
     
    # 这个在运行时,调用的是Android自带的UI框架UiAutomator的Api
    # 介绍几个简单常用的,text、className、resource-id
    # text
    # 匹配全部text文字
    driver.find_element_by_android_uiautomator('new UiSelector().text("手机号")')
    # 包含text文字
    driver.find_element_by_android_uiautomator('new UiSelector().textContains("机")')
    # 以text什么开始
    driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("手")')
    # 正则匹配text
    driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^手.*")')
     
    # className
    driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')
    # classNameMatches
    driver.find_elements_by_android_uiautomator('new UiSelector().classNameMatches("^android.widget.*")')
     
    # resource-id、resourceIdMatches
    driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.syqy.wecash:id/et_content")')
     
    # description
    driver.find_element_by_android_uiautomator('new UiSelector().description("S 日历")')
    # descriptionStartsWith
    driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("日历")')
    # descriptionMatches
    driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*历$")')
     
    # Native App 暂不能使用
    driver.find_element_by_tag_name('')
     
    # Native App 暂不能使用
    driver.find_element_by_partial_link_text('')
     
    # Native App 暂不能使用
    driver.find_element_by_link_text('')
     
    # Native App 暂不能使用
    driver.find_element_by_css_selector('')

    操作APP

    # 返回是否安装了对应包名的App True 或者 False
    driver.is_app_installed('com.syqy.wecash')
     
    # 关闭初始化信息中的App
    driver.close_app()
     
    # 启动初始化信息中的App
    driver.launch_app()
     
    # 安装app 参数为软件的绝对路径
    driver.install_app(r'C:UsersjhouyafanDesktop	esterappUiwecash.apk')
     
    # 卸载app 参数接收appPackageName
    driver.remove_app('com.syqy.wecash')
     
    # 获取当前打开的app名
    driver.current_activity
     
    # 启动某一个包的,某一个入口
    # 参数接受appPackage,appActivity
    # 可以省略多个步骤直接到达指定测试的位置
    driver.start_activity('com.android.browser','.BrowserActivity')
     
    # 每隔0.5秒判断一次当前的app名称是否是activityName
    # WebDriverWait
    driver.wait_activity('activityName', 5, 0.5)
     
    # 将启动的app退出到后台,多少秒后在切回app
    driver.background_app('m')
     
    # 清除应用数据缓存,相当于卸载重装
    driver.reset() 

    NATIVE_APP 与 WEBVIEW 上下文操作

    # 返回当前session中的app类型
    driver.current_context
     
    # 返回当前app的类型
    # WEBVIEW 或 WEBVIEW
    # 底层实际调用current_context
    driver.context
     
    # 获取app所有的类型
    # 有WEBVIEW的则以list的形式展示两个
    driver.contexts
     
    # app类型切换 参数接收app类型
    # appium对selenium的switch_to的扩展
    # 增加了MobileSwitchTo,继承了selenium的switch_to
    driver.switch_to.context('context')

    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) 

    网络

    操作输入法

    # 返回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() 

    其他

  • 相关阅读:
    linux网络编程系列TCP及常用接口分析
    Linux网络编程系列TCP状态分析
    常见的HTTP 1.1状态代码及含义
    修改android SDK 模拟器(avd) 内存大小
    Android应用研发核心竞争力
    网路编程——阻塞式&&非阻塞式
    URI、URL和URN之间的区别与联系
    初识android——四大组件
    无依赖的combobox组件(autocomplete组件)
    为什么JS没有catchMyException或类似的方法
  • 原文地址:https://www.cnblogs.com/feng0815/p/8481495.html
Copyright © 2011-2022 走看看