• Appium 移动端自动化测试(Mac)


    目录

    adb调试工具(Android Debug Bridge)

     adb常用命令

    Appium使用

    快速体验步骤

    Appium常用方法

    UIAutomatorViewer 获取元素

    元素等待(在指定时间内一直等待

    元素操作

    Swipe 滑动和拖拽事件(Scroll、drag_and_drop)

    手势操作TouchAction

    手机操作API(分辨率、按钮、截图、网络、通知栏)

    网络补充:


    0. 环境基础

    • Java(jdk 1.8)
    • Android SDK(adb)
    • Android模拟器(Genymotion、VirtualBox)

    adb调试工具(Android Debug Bridge)

    adb包含三个部分:

    1. Client端:运行在开发电脑上,负责发送adb命令
    2. Daemon守护进程:运行在手机(或模拟器),负责接收和执行adb命令
    3. Server端:运行在开发电脑上,负责管理Client端和手机Daemon之间的通信

    adb工作原理:

    1. Client端将命令发送给Server端
    2. Server端将命令发送给Daemon端
    3. Daemon端执行
    4. Daemon端将执行结果,返回给Server端
    5. Server端将结果再返回给Client端

     adb常用命令

    获取当前包名界面名(告诉手机测试哪个应用程序的哪个一个界面

    • 包名(package):一个应用程序的唯一ID
    • 界面名(activity):一个界面名对应一个界面

    adb shell dumpsys window | grep mFocusedApp

            返回结果中,“/” 前的为包名,“/” 后的为界面名

     文件传输

    从电脑发送文件到手机: adb push 电脑文件路径 手机的文件夹路径

    从手机中拉取文件:adb pull 手机文件路径 电脑的文件夹路径

    获取app启动时间

    adb shell am start -w 包名/启动名

    • ThisTime:该界面(activity)启动耗时(毫秒)
    • TotalTime:应用自身启动耗时 = ThisTime + 应用application等资源启动时间(毫秒)
    • WaitTime:系统启动应用耗时 = TotalTime + 系统资源启动时间(毫秒)

    点击图标 -> 系统资源调度 -> application程序启动 -> activity界面加载 -> 界面展示完成

    获取手机日志

    adb logcat

    找日志中at……前面 第一个字符为 "E" 的均为错误信息

    • 安装app到手机                                adb install 路径/xx.apk
    • 卸载手机上的app                             adb uninstall 包名
    • 获取当前电脑已经连接的设备          adb devices
    • 进入到安卓手机内部的Linux            adb shell     exit退出Linux

    # 重启adb服务

    • 启动adb服务器                                adb start-server
    • 停止adb服务器                                adb kill-server
    • 查看adb帮助                                    adb --help

    Appium使用

    快速体验步骤

    1. 打开手机模拟器(Genymotion)
    2. 打开appium.app工具
    3. 创建Python项目 from appium import webdriver
    1. from appium import webdriver
    2. import time
    3. desired_caps = dict()
    4. desired_caps['platformName'] = 'Android'
    5. desired_caps['platformVersion'] = '10'
    6. # 设备名,按默认,主要用于限制iOS
    7. desired_caps['deviceName'] = '192.168.56.101:5555'
    8. # 包名
    9. desired_caps['appPackage'] = 'com.android.settings'
    10. # 界面名
    11. desired_caps['appActivity'] = '.Settings'
    12. # 解决中文输入问题
    13. desired_caps['unicodeKeyboard'] = True
    14. desired_caps['resetKeyboard'] = True
    15. driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    16. time.sleep(5)
    17. driver.quit()

    原理:

    • appium实际上在本机上使用4723端口开启了一个服务
    • Python代码通过访问本机的服务器,获取driver对象
    • appium将我们的driver对象调用的方法转化成POST请求,提交给appium服务器
    • appium通过接收到的POST请求发送给手机,再由手机进行执行

    Appium常用方法

    1. # 打开指定包指定界面
    2. driver.start_activity(“appPackage包名”, “appActivity界面名”)
    3. # 获取包名
    4. driver.current_package
    5. # 获取界面名
    6. driver.current_activity
    7. # ——————关——————闭——————
    8. # 关闭当前app,不关闭驱动对象
    9. driver.close_app()
    10. # 关闭驱动对象,同时关闭所有关联的app
    11. driver.quit()
    12. # ——————安装卸载及是否安装——————
    13. # 安装app
    14. driver.install_app("app_path apk安装包路径")
    15. # 卸载app
    16. driver.remove_app("app_id 包名")
    17. # 判断app是否已经安装
    18. driver.is_app_installed("app_id 包名")
    19. # ——————将应用置于后台——————
    20. driver.background_app(seconds 秒数)

    UIAutomatorViewer 获取元素

    启动该程序使用Device Screenshot工具获取元素特征信息

    1. # 通过id定位(resource id)
    2. driver.find_element_by_id("id-value").click() #并点击
    3. # 通过class_name定位
    4. driver.find_element_by_class_name("class-value").send_keys("hello") #并输入hello
    5. # 通过xpath定位 # 包含则使用://*[contains(@变量名,'xx')]
    6. driver.find_element_by_xpath("xpath-value表达式://*[@变量名='xx']")
    7. # 定位一组元素 by_id / by_class_name / by_xpath
    8. driver.find_elements_by_id("xxxx")

    元素等待(在指定时间内一直等待

    1. # 隐式等待(秒),全局有效
    2. driver.implicitly_wait(20)
    3. # 显式等待,对单个元素有效
    4. from selenium.webdriver.support.wait import WebDriverWait
    5. wait = WebDriverWait(driver, 5)
    6. # 仅对修饰元素有效
    7. back_button = wait.until(lambda x: x.find_element_by_xpath("xxxx"))
    8. back_button.click()

    元素操作

    1. element.click()
    2. element.send_keys("xxx")
    3. # 清空输入框内容
    4. element.clear()
    5. # 获取元素内容
    6. element.text
    7. element.location
    8. element.size
    9. # 获取元素属性 如:name(content-desc / text)、resourceId、className、enabled、clickable")
    10. element.get_arribute("属性名")

    Swipe 滑动和拖拽事件(Scroll、drag_and_drop)

    1. # Swipe 从一个坐标滑动到另一个坐标,duration 滑动持续时间长短,单位:ms
    2. driver.swipe(start_x, start_y, end_x, end_y, duration=None)
    3. # scroll 从一个元素滑动到另一个元素,直到页面惯性结束自动停止
    4. button1 = driver.find_element_by_id("xxx")
    5. button2 = driver.find_element_by_id("xxxx")
    6. driver.scroll(button1, button2)
    7. # drag_and_drop 从一个元素滑动到另一个,第二个元素代替第一个元素的位置
    8. driver.drag_and_drop(button1, button2)

    手势操作TouchAction

    1. # 创建TouchAction对象
    2. touch_action = TouchAction(driver)
    3. # 轻敲
    4. touch_action = touch_action.tap(element=元素, x=xxx, y=xxx, count=次数)
    5. # 执行
    6. touch.perform()
    1. 创建TouchAction对象
    2. 通过对象调用执行手势
    3. perform() 执行动作

    轻点tap、按下press、抬起release、等待wait、长按long_press、移动move_to

    1. # 轻敲 tap(element,x,y,count)
    2. TouchAction(driver).tap(element=元素, x=xxx, y=xxx, count=次数).perform()
    3. # 按下和抬起 press、release
    4. TouchAction(driver).press(x=xxx, y=xxx).release().press()..release().perform()
    5. # 等待 wait (单位:ms)
    6. TouchAction(driver).press(x=xxx, y=xxx).wait(2000).release().perform()
    7. # 长按 long_press
    8. TouchAction(driver).long_press(element, x=坐标, y=坐标, duration=持续时间).perform()
    9. # 移动 move_to
    10. TouchAction(driver).press(x=坐标, y=坐标).move_to(x=坐标, y=坐标).release().perform()

    手机操作API(分辨率、按钮、截图、网络、通知栏)

    Android KeyCode:Android KeyCode列表_51CTO博客_event.keycode

    1. # 获取手机分辨率
    2. driver.get_window_size()
    3. # 截图
    4. driver.get_screenshot_as_file("path.filename")
    5. # 获取网络
    6. print(driver.network_connection)
    7. # 设置网络
    8. driver.set_network_connection(数字0-6)
    9. # 发送键到设备 Android Keycode
    10. driver.press_keycode("keycode", metastate=None)
    11. # 打开通知栏
    12. driver.open_notifications()
    13. # 返回键
    14. driver.press_keycode(4)

    网络补充:

    from appium.webdriver.connectiontype import ConnectionType

    class ConnectionType:
        NO_CONNECTION = 0
        AIRPLANE_MODE = 1
        WIFI_ONLY = 2
        DATA_ONLY = 4
        ALL_NETWORK_ON = 6

  • 相关阅读:
    AVB(二):DTO 支持
    【在Vue脚手架项目中使用qs框架】
    浅谈免杀下的持久化
    蓝牙芯片香薰机智能化方案
    微服务、SOA 和 API 之间的区别
    促进国内凝聚态物理理论与统计物理及交叉学科的学术交流及促进学科发展,与龙讯旷腾相约济南
    数据挖掘实战(3):如何对比特币走势进行预测?
    python的语法错误与异常
    Guitar Pro8最新2023中文免费吉他乐谱作曲练习工具
    MFC软件国际化的几个问题及其解决方案
  • 原文地址:https://blog.csdn.net/qq_52057693/article/details/127882383