浅尝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的机器连接在一起的。
相关推荐
Juicedata18 分钟前
多云架构,JuiceFS 如何实现一致性与低延迟的数据分发
运维·云原生·架构
大熊程序猿29 分钟前
drawDB docker部属
运维·docker·容器
Flaky559132 分钟前
基于 docker 搭建 rails 开发环境(两种方法)
运维·docker·容器·php·php开发·servbay·php本地开发环境
Aloudata3 小时前
NoETL 自动化指标平台如何帮助企业实现战略目标与执行目标对齐?
大数据·数据挖掘·数据分析·自动化·指标平台
众拾达人5 小时前
基于 SSH 的任务调度系统
运维·ssh
凯子坚持 c5 小时前
深度解析如何使用Linux中的git操作
linux·运维·git
come-昂-6 小时前
Jenkins使用入门
运维·jenkins
MagicUrban6 小时前
三维管线管网自动化建模工具MagicPipe3D V3.6.0
3d·自动化·gis·bim·地下管网
会飞的爱迪生6 小时前
nginx负载均衡-基于多域名的负载均衡(二)
运维·nginx·负载均衡