美文网首页
appium应用之“获取设备信息和设备操作”(android)

appium应用之“获取设备信息和设备操作”(android)

作者: rr1990 | 来源:发表于2019-04-11 18:59 被阅读0次

    一、获取设备信息

    1. 获取设备大小

    • driver.get_window_size()
      获取设备的长度和高度,返回值为字典类型,key值为width、height
    window_size = driver.get_window_size()
    print(window_size)      # {'width': 1080, 'height': 1920}
    

    2. 获取设备上下文信息

    • driver.contexts
      获取所有的上下文信息,返回值为列表类型
    • driver.context
      获取当前上下文,返回值为字符串类型
    • driver.current_context
      获取当前上下文,返回值为字符串类型
    # 获取所有的上下文
    all_contexts = driver.contexts
    print(all_contexts)         # ['NATIVE_APP']
    # 获取当前上下文
    cur_context = driver.context
    print(cur_context)          # NATIVE_APP
    cur_context1 = driver.current_context
    print(cur_context1)         # NATIVE_APP
    

    3. 获取当前应用的信息

    • driver.current_activity
      获取当前应用的activity信息
    • driver.current_package
      获取当前应用的package信息
    app_activity = driver.current_activity
    print(app_activity)         # .MainSettings
    app_package = driver.current_package
    print(app_package)          # com.android.settings
    

    二、设备操作

    1. 等待activity出现操作

    • driver.wait_activity(activity, timeout, interval=1)
      等待目标页面出现,若在设置时间内目标页面出现则直接跳出等待,同时返回True; 若超过设置时间目标页面仍未出现则返回False
      activity:目标activity
      timeout:超时时间设置,单位为s
      interval:循环查询的时间间隔,单位为s,默认为1s
      目的:主要用于一些应用启动时界面的activity与进入应用时界面的activity不一致,这样就会存在等待时间,而这个等待时间每次可能不一样,故可通过设置超时来等待。
    # 判断10s内是否已成功进入所需的目标activity
    desired_caps = {'platformName': 'Android',
                    'platformVersion': '8.1',
                    'deviceName': 'XXX',
                    'automationName': 'Appium',
                    'noReset': 'true',
                    'unicodeKeyboard': 'true',
                    'resetKeyboard': 'true',
                    'appPackage': 'com.kugou.android',
                    'appActivity': '.app.splash.SplashActivity'
                    }
    driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
    is_target_activity = driver.wait_activity("com.kugou.common.useraccount.app.KgUserLoginAndRegActivity", 10)
    if is_target_activity is True:
        print("成功进入目标主页面,可继续执行其他操作")
    else:
        print("超过未进入目标主页面")
    

    2. 退出设备操作

    • driver.quit()
      退出设备并关闭所有相关窗口。

    3. android按键操作

    常用按键的keycode:
        KEYCODE_HOME(home键):3
        KEYCODE_BACK(back键):4
        KEYCODE_SEARCH(搜索键):84
        KEYCODE_ENTER(回车键):66
        KEYCODE_MENU(菜单键):82
        KEYCODE_POWER(电源键):26
        KEYCODE_NOTIFICATION(通知键):83 
        KEYCODE_CALL(拨号键):5
        KEYCODE_ENDCALL(挂机键):6
        ...
    
    3.1. 点击按键
    • driver.press_keycode(keycode, metastate=None, flags=None)
    • driver.keyevent(keycode, metastate=None)
    3.2. 长按按键
    • driver.long_press_keycode(self, keycode, metastate=None, flags=None)
    # 点击home键
    driver.press_keycode(3)
    driver.keyevent(3)
    # 长按home键
    driver.long_press_keycode(3)
    

    4. 模拟手势点击坐标点操作

    4.1. tap函数方法介绍
    • driver.tap(positions, duration=None)
      模拟手指(最多支持5个手指)点击某个特定位置并保持一定时间
      positions:坐标位置,列表list类型,每个对象是元组tuple类型(x, y)。
      positions长度,最小为1,最大为5,即格式可为: [(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5)]。
      duration:持续时间,单位ms,默认为None。
      duration=None表示仅执行点击动作;duration!=None表示执行长按点击动作,维持duration时间后再释放;
    4.2. 获取元素坐标方法

    (1)通过元素的bounds值来获取点击坐标:
    元素的bounds值格式为 [x1, y1][x2, y2],x1和y1为元素的左上角位置,x2和y2为元素的右下角位置。
    但赋值给positions参数,需要将格式更改一下,改为 [(x1, y1), (x2, y2)]
    (2)手动获取元素坐标
    机器进入“开发者选项”,开启“指针位置”,手动点击元素从而获取元素的坐标

    # 长按点击元素坐标,同时保持500ms再释放
    driver.tap( [(204, 358), (790, 496)], 500)
    driver.press_keycode(4)
    driver.tap([(204, 358)], 500)
    driver.press_keycode(4)
    # 点击元素坐标
    driver.tap([(204, 358), (790, 496)])
    driver.press_keycode(4)
    driver.tap([(204, 358)])
    

    5. 滑动操作

    5.1. swipe和flick函数方法介绍
    • driver.swipe(start_x, start_y, end_x, end_y, duration=None)
      将屏幕从一个点滑动到另一个点
      start_x:滑动起始点的x轴坐标
      start_y:滑动起始点的y轴坐标
      end_x:滑动结束点的x轴坐标
      end_y:滑动结束点的y轴坐标
      duration:滑动的持续时间,单位ms

    • driver.flick(start_x, start_y, end_x, end_y)
      将屏幕从一个点快速滑动到另一个点

    5.2. 说明

    可用于将整个屏幕或某个元素执行向左、向右、向上、向下滑动;也可用于从某个坐标点滑动到另一个坐标点。
    由于测试过程中会不断使用到swipe函数的滑动操作,故可将屏幕或元素向左、向右、向上、向下滑动进行封装,以便下次直接使用。

    # 向上滑动屏幕:先获取屏幕的宽度和高度,再将屏幕从下往上滑动
    window_size = driver.get_window_size()
    start_x = window_size['width'] * 0.5
    start_y = window_size['height'] * 0.75
    end_y = window_size['height'] * 0.25
    driver.swipe(start_x, start_y, start_x, end_y, 500)
    # 向上滑动元素:先获取元素的起始坐标、宽度和高度,再将元素从下往上滑动
    element = driver.find_element_by_id("android:id/list")
    ele_rect = element.rect
    start_x1 = ele_rect['x'] + ele_rect['width'] * 0.5
    start_y1 = ele_rect['y'] + ele_rect['height'] * 0.75
    end_y2 = ele_rect['y'] + ele_rect['height'] * 0.25
    driver.swipe(start_x1, start_y1, start_x1, end_y2, 500)
    # 直接使用坐标点向上滑动屏幕
    driver.swipe(500, 700, 500, 300, 500)
    # 快速滑动
    driver.flick(start_x, start_y, start_x, end_y)
    

    6. app操作

    6.1. app的安装、卸载、判断
    • driver.install_app(app_path, **options):安装app
      app_path:安装app的路径;
      **options:安装app的其他设置参数,如replace、timeout、allowTestPackages、useSdcard、grantPermissions参数;
      replace:若app已存在于测试机中,是否重新安装,默认为True;
      timeout:等待安装完成的时间,默认为60000ms;
      allowTestPackages:是否允许将安装包标记为测试,默认为False;
      useSdcard:是否使用SD卡安装app,默认为False;
      grantPermissions:安装完成后是否自动授予Android6+上的应用权限,默认为False;

    • driver.is_app_installed(bundle_id):判断app是否已安装
      bundle_id:要查询的应用程序的ID信息,可用package来判断

    • driver.remove_app(app_id, **options):卸载app
      app_id:要卸载的应用程序的ID信息
      **options:卸载app的其他设置参数,如keepData、timeout参数;
      keepData:卸载app后是否保留应用程序数据和缓存,默认为False;
      timeout:等待卸载完成的时间,默认为20000ms;

    6.2. app后台运行、启动、重置、关闭、终止操作
    • driver.launch_app()
      启动desired capabilities参数中的应用

    • driver.close_app()
      关闭desired capabilitied参数中运行的应用程序

    • driver.background_app(seconds)
      将设备当前的应用程序置于后台运行,保持seconds秒后再重新回到前台运行
      seconds:后台运行的时间,单位s

    • driver.reset()
      重置设备当前的应用程序,将程序恢复到默认

    • driver.terminate_app(app_id, **options)
      如果某个应用程序app_id正在运行,则终止该应用程序
      app_id:要终止的应用程序的ID信息
      **options:要终止的应用程序的其他设置参数,如keepData、timeout参数;
      timeout:等待时间默认为500ms

    • driver.start_activity(app_package, app_activity, **opts)
      启动某个app
      app_package:启动应用的包名
      app_activity:启动的activity
      **opts:其他可能需要添加的参数,如app_wait_package、app_wait_activity、intent_action......
      app_wait_package:等待某个应用的包名出现
      app_wait_activity:等待某个应用的界面出现

    # 安装app
    driver.install_app("F:\\test.apk")
    # 判断app是否已安装
    is_installed = driver.is_app_installed("com.tencent.wstt.gt")
    print(is_installed)
    # 关闭desired capabilities参数中的应用
    driver.close_app()
    # 启动desired capabilities参数中的应用
    driver.launch_app()
    # 后台运行设备当前的应用
    driver.background_app(5)
    # 重置设备当前的应用
    driver.reset()
    # 卸载应用
    driver.remove_app("com.tencent.wstt.gt")
    # 终止应用
    driver.terminate_app("com.kugou.android")
    # 启动某个应用
    driver.start_activity("com.kugou.android", ".app.splash.SplashActivity")
    

    7. 截图操作

    • driver.get_screenshot_as_file(filename)
      filename:保存截图的路径+截图名称
      若filename不是以.png结尾,则也会执行截图操作,但会有警告提示,故建议一般使用.png结尾的截图。
      若截图成功,则返回True;若出现IOError错误则返回False。
    filename = r"F:\test.png"
    driver.get_screenshot_as_file(filename)
    

    8. 滚动元素操作

    • driver.scroll(origin_el, destination_el, duration=None)
      从origin_el元素滚动到destination_el元素
      界面为上下滑动:origin_ele在destination_el元素上面时,则执行向下滚动;origin_ele在destination_el元素下面时,则原始元素会滚动到目标元素位置。
      界面为左右滑动:origin_ele在destination_el元素左边时,则先执行向右滚动再执行向左滚动;origin_ele在destination_el元素右边时,则先执行向左滚动再执行向右滚动。
      注:需要这两个元素在当前界面上存在,否则会报错。
    ele1 = driver.find_element_by_xpath("//*[@text='壁纸']")
    ele2 = driver.find_element_by_xpath("//*[@text='WLAN']")
    driver.scroll(ele1, ele2)
    

    9. 拖拽元素操作

    • driver.drag_and_drop(origin_el, destination_el)
      将origin_el元素拖拽到destination_el元素位置
      注:需要元素支持拖拽操作,比如,桌面icon的拖拽操作
    ele1 = driver.find_element_by_xpath("//*[@content-desc='天气']")
    ele2 = driver.find_element_by_xpath("//*[@content-desc='安全中心']")
    driver.drag_and_drop(ele1, ele2)
    

    10. 打开通知栏操作

    • driver.open_notifications()

    相关文章

      网友评论

          本文标题:appium应用之“获取设备信息和设备操作”(android)

          本文链接:https://www.haomeiwen.com/subject/mqlniqtx.html