浅尝Appium自动化框架

浅尝Appium自动化框架

Appium自动化框架介绍

Appium 是一个开源的自动化测试框架,最初设计用于移动应用的测试,但现在它也扩展了对桌面端应用的支持。Appium 使得自动化测试变得更加简单,并且支持跨平台,能够同时对 iOS、Android、Windows 和 macOS 平台上的应用进行自动化测试。
不同于Selenium只是用来自动化测试web程序,Appium可以自动化测试各个平台的原生应用。

👉👉👉官网

Appium原理

c 复制代码
+------------------+
|  Test Scripts    |
|  (Java, Python,  |
|  JavaScript)     |
+--------+---------+
         |
         v
+--------+---------+
|  Appium Server   |
|  (HTTP Server)   |
+--------+---------+
         |
   +------------------------------+------------------------------------+
   |                   |                  |                    |
   v                   v                  v                    v
+------------+   +-------------+     +--------------+   +--------------+
| iOSDriver |   | AndroidDriver |   | WindowsDriver |   | macOSDriver  |
|  XCUITest |   | (UIAutomator) |   | (WinAppDriver)|   | (macOSDriver)|
+------------+   +-------------+     +--------------+   +--------------+
       |                |                   |                  |
+------------+   +-------------+     +--------------+   +--------------+
| iOS App |      | Android App|      | Windows App|      | macOS App |
+------------+   +-------------+     +--------------+   +--------------+
  • Test Scripts
    测试脚本可以使用不同编程语言编写,如 Java、Python 或 JavaScript,向 Appium Server 发送 HTTP 请求。
  • Appium Server
    Appium Server 是一个 HTTP 服务器,负责接收客户端的请求,并将请求转发给相应的平台驱动程序。
  • 平台驱动
    iOSDriver: 用于 iOS 平台,支持通过 XCUITest 或 UIAutomation 与 iOS 设备交互。
    AndroidDriver: 用于 Android 平台,支持通过 UIAutomator 或 Espresso 与 Android 设备交互。
    WindowsDriver (WinAppDriver): 用于 Windows 平台,支持通过 WinAppDriver 进行桌面应用的自动化测试。
    macOSDriver: 用于 macOS 平台,支持通过 macOSDriver 进行桌面应用的自动化测试。
  • 应用
    驱动程序与设备或模拟器上的应用进行交互,执行各种操作,如启动应用、查找元素、点击、输入等。

Appium使用

安装平台驱动

驱动 平台 适用场景
uiautomator2 Android 原生 Android 应用自动化
xcuitest iOS 原生 iOS 应用自动化
espresso Android 适用于使用 espresso 框架的 Android 应用
mac2 macOS macOS 应用自动化(桌面应用)
windows Windows Windows 应用自动化(桌面应用)
safari iOS iOS Safari 浏览器自动化
gecko Android, iOS Firefox 浏览器自动化
chromium Android, macOS, Windows Chromium 浏览器自动化(包括 Chrome)

比如:

安装mac驱动

bash 复制代码
appium driver install mac2

安装后可以用如下命令看是否安装成功。

bash 复制代码
appium driver list --installed

实战

玩了2天,发现Appium对mac和win上的桌面应用支持的并不是太好,至少兼容性一般。后面我就转到测试android手机上的应用。写了小demo玩玩,打开QQ,找到某某人,发送特定消息。

python 复制代码
import time

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy

# Desired Capabilities 配置
desired_caps = dict(
  platformName="Android",
  platformVersion="14",
  deviceName="RFCT20EGLNJ",
  automationName="UiAutomator2",
  appPackage="com.tencent.mobileqq",
  appActivity="com.tencent.mobileqq.activity.SplashActivity",
  enforceXPath1=True,
  noReset=True
)

# 连接 Appium Server
driver = webdriver.Remote("http://127.0.0.1:4723", options = UiAutomator2Options().load_capabilities(desired_caps))

try:
    # 等待并点击搜索按钮
    search_button = driver.find_element(AppiumBy.ID, "com.tencent.mobileqq:id/wwk")
    search_button.click()
    time.sleep(2)

    # 等待搜索输入框并输入 QQ 号码
    search_layout = driver.find_element(AppiumBy.ID, "com.tencent.mobileqq:id/jo9")
    location = search_layout.location
    size = search_layout.size

    # 点击搜索框(聚焦)
    driver.tap([(location['x'] + size['width'] / 2, location['y'] + size['height'] / 2)], 500)

    # 输入qq号码
    driver.press_keycode(16)
    driver.press_keycode(10)
    driver.press_keycode(9)
    driver.press_keycode(16)

    # 点击qq用户
    user_list_layout = driver.find_element(AppiumBy.XPATH, '(//android.widget.LinearLayout[@resource-id="com.tencent.mobileqq:id/ecl"])[1]')

    # user_button = user_list_layout.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'text("freedom-studio")')   # 可以定位,精确匹配
    user_button = user_list_layout.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("freedom")') # 可以定位,模糊匹配
    # user_button = user_list_layout.find_element(AppiumBy.XPATH, './/*[contains(text(), "freedom")]')     # 无法定位
    user_button.click()
    time.sleep(2)

    # 找到聊天输入框
    msg_input = driver.find_element(AppiumBy.ID, 'com.tencent.mobileqq:id/input')
    msg_input.send_keys("hello")

    # 找到发送按钮
    send_button = driver.find_element(AppiumBy.ID, 'com.tencent.mobileqq:id/send_btn')
    send_button.click()

    print("Message sent successfully!")

finally:
    # 退出会话
    driver.quit()

期间要用到Appium Inspector这个工具,就是用来定位元素的。

记得要先安装adb工具哦。

其中,

appium:deviceName(设备名)可以通过adb devices获取。

bash 复制代码
adb devices

appium:appPackage(应用包名)和appium:appActivity(应用界面)可以通过如下adb命令获取。

bash 复制代码
adb shell dumpsys window | grep "mCurrentFocus"

最右边的Selected Element里就有xpath,id等信息。如果没有也别感到意外,那就是没有,只能通过其他方法定位元素了。

比如代码里的

python 复制代码
# user_button = user_list_layout.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'text("freedom-studio")')   # 可以定位,精确匹配
user_button = user_list_layout.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("freedom")') # 可以定位,模糊匹配
# user_button = user_list_layout.find_element(AppiumBy.XPATH, './/*[contains(text(), "freedom")]')     # 无法定位

理论上,从Appium Inspector里看结构很清晰,XPath肯定是可以定位到的,但是实际就是不行,那只能试试其他方法了,比如AppiumBy.ANDROID_UIAUTOMATOR。

玩Appium也遇到不少坑。

  1. Appium对桌面应用程序支持的并不是非常好,主要还是用来做手机应用的自动化。比如在mac或者win上Appium Inspector经常无法定位特定元素。
  2. 我们一般使用ID, XPath来定位元素,但是有时候定位不到,那也只能另辟蹊径,比如用位置坐标来定位,再比如用ANDROID_UIAUTOMATOR等等。
  3. 测试设备是要和启动appium server的机器连接在一起的。
相关推荐
努力的小T4 小时前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
枫叶落雨2225 小时前
08-Elasticsearch
运维·jenkins
爆更小小刘6 小时前
Linux下基本指令(4)
linux·运维·服务器
我码玄黄6 小时前
解决本地模拟IP的DHCP冲突问题
linux·运维
若云止水6 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_os_init 函数
运维·nginx
Self-Discipline6 小时前
Linux arm64 IOMMU总结
linux·运维·服务器
我言秋日胜春朝★6 小时前
【Linux】命名管道------Linux进程间通信的桥梁
linux·运维·服务器
Dontla7 小时前
华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)
运维·服务器·chrome
wenchun0017 小时前
【并发压测】高并发下Linux流量监控
linux·运维·服务器
从后端到QT7 小时前
ubuntu磁盘清理垃圾文件
linux·运维·ubuntu