浅尝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的机器连接在一起的。
相关推荐
码农101号2 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
程序员的世界你不懂2 小时前
Appium+python自动化(十)- 元素定位
python·appium·自动化
powerfulzyh2 小时前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩2 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos
爱学习的小道长2 小时前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
EelBarb2 小时前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu
402 Payment Required2 小时前
serv00 ssh登录保活脚本-邮件通知版
运维·chrome·ssh
小柏ぁ3 小时前
calico/node is not ready: BIRD is not ready: BGP not established with xxx
运维·docker·kubernetes
Mintimate3 小时前
云服务器 Linux 手动 DD 安装第三方 Linux 发行版:原理与实战
linux·运维·服务器
RussellFans3 小时前
Linux 环境配置
linux·运维·服务器