浅尝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的机器连接在一起的。
相关推荐
水银嘻嘻4 小时前
08 web 自动化之 PO 设计模式详解
前端·自动化
小冯的编程学习之路5 小时前
【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
c++·selenium·测试工具·jmeter·自动化·测试用例·postman
曼岛_7 小时前
[架构之美]linux常见故障问题解决方案(十九)
linux·运维·架构
大蚂蚁2号8 小时前
windows文件共享另一台电脑资源管理器网络文件夹无法找到机器
运维·服务器·网络
Lw老王要学习9 小时前
Linux数据库篇、第一章_02_MySQL的使用增删改查
linux·运维·数据库·mysql·云计算·it
斤斤计较9 小时前
Docker 环境安装(2025最新版)
运维·docker·容器
小锋学长生活大爆炸9 小时前
【教程】Docker方式本地部署Overleaf
运维·docker·容器
掘金者说9 小时前
docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)
运维·docker·容器
2302_7995257410 小时前
【Linux】第十六章 分析和存储日志
linux·运维·服务器
愚润求学10 小时前
【Linux】Ext系列文件系统
linux·运维·服务器·笔记