App UI自动化--Appium学习--第二篇

如果第一篇在运行代码的时候出现问题,建议参考我的上一篇文章解决。

1、APP界面信息获取

bash 复制代码
adb logcat|grep -i displayed

代码含义是获取当前应用的包名和界面名。

根据日志信息修改代码当中的包名和界面名,就可以跳转对应的界面。

2、界面元素获取

所需工具

下载链接

下载地址

安装步骤

安装教学地址

基本配置及入门操作指南

参考操作指南

3、APPium+Python的常规操作

Appium 是一个开源工具,用于自动化测试移动应用程序(iOS 和 Android)。结合 Python 使用时,它可以帮助你编写脚本以自动执行各种操作。下面是一些基本的元素获取方式和常规操作介绍。

元素获取方式

  1. 通过ID查找元素

    如果你知道某个元素的资源ID,可以使用 find_element_by_id 方法来定位它。

    python 复制代码
    element = driver.find_element_by_id("resource_id")
  2. 通过类名查找元素

    当你想通过元素的类名来定位它时,可以使用 find_elements_by_class_name 方法。

    python 复制代码
    elements = driver.find_elements_by_class_name("android.widget.EditText")
  3. 通过XPath查找元素

    XPath 是一种强大的路径语言,用于在 XML 文档中查找信息。同样适用于 HTML 和 XML 格式的 UI 层级结构。

    python 复制代码
    element = driver.find_element_by_xpath("//android.widget.TextView[@text='登录']")
  4. 通过Accessibility ID查找元素

    Accessibility ID 提供了一种独立于平台的方式标识元素,对于跨平台测试非常有用。

    python 复制代码
    element = driver.find_element_by_accessibility_id("accessibility_id")
  5. swipe滑动

    按手机界面绝对坐标滑动,对于不同手机而言,绝对坐标会发生变化,需要使用相对坐标(获取元素坐标,根据这个元素的坐标来滑动)。

python 复制代码
driver.swipe(start_x,start_y,end_x,end_y,duration=None)
  1. scroll滑动
    从一个元素滑动到另一个元素,直到页面自动停止,惯性很大。
python 复制代码
driver.scroll(origin_el, destination_el) # 参数一,滑动开始的元素,参数二滑动结束的元素。
  1. drag_and_drop拖拽
    从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的那个位置,没有惯性。
python 复制代码
driver.drag_and_drop(origin_el,destination _el)

常用手势操作

1. 滑动(Swipe)

滑动操作可以用来滚动页面或列表。你可以指定起始点和结束点来执行滑动动作。

python 复制代码
# 使用 TouchAction 实现滑动
from appium.webdriver.common.touch_action import TouchAction

action = TouchAction(driver)
action.press(x=100, y=200).move_to(x=100, y=500).release().perform()
2. 长按(Long Press)

长按某个元素或屏幕上的某一点,可以模拟用户的长按操作。

python 复制代码
# 长按一个元素
element = driver.find_element_by_id("some_element_id")
action = TouchAction(driver)
action.long_press(el=element, duration=3000).release().perform()
3. 轻敲(Tap)

轻敲是模拟用户点击屏幕的行为,可以通过坐标或直接对元素进行轻敲。

python 复制代码
# 对元素进行轻敲
element = driver.find_element_by_id("some_element_id")
action = TouchAction(driver)
action.tap(element=element).perform()

# 通过坐标进行轻敲
action = TouchAction(driver)
action.tap(x=100, y=200).perform()
4. 缩放(Pinch and Zoom)

缩放操作涉及到两个手指的动作,通常用于放大或缩小图片或地图等内容。

  • 放大(Pinch Open)
python 复制代码
driver.execute_script('mobile: pinchOpen', {'scale': 2.0, 'velocity': -1})
  • 缩小(Pinch Close)
python 复制代码
driver.execute_script('mobile: pinchClose', {'scale': 0.5, 'velocity': 1})

请注意,这些命令可能需要特定的设置或设备支持,并且不同版本的 Appium 可能会有不同的实现方式。

5. 拖拽(Drag and Drop)

拖拽是指将一个元素从一个位置拖到另一个位置。

python 复制代码
element1 = driver.find_element_by_id("source_element_id")
element2 = driver.find_element_by_id("destination_element_id")
action = TouchAction(driver)
action.long_press(el=element1).move_to(el=element2).release().perform()

常规操作

  • 点击元素

    python 复制代码
    element.click()
  • 输入文本

    python 复制代码
    element.send_keys("Hello World!")
  • 清除文本

    python 复制代码
    element.clear()
  • 获取元素文本

    python 复制代码
    text = element.text
  • 等待元素出现

    在进行元素交互之前,有时需要等待元素加载完成。可以使用显式等待:

    python 复制代码
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, "resource_id")))

获取手机网络状态并进行设置

在使用 Appium 进行移动应用自动化测试时,获取和设置设备的网络连接状态是一个常见的需求。Appium 提供了相应的 API 来实现这些操作。以下是如何使用 Python 和 Appium 来获取和设置手机网络连接的具体方法。

获取手机网络连接状态

你可以使用 network_connection 方法来获取当前设备的网络连接状态。不过需要注意的是,这个功能主要适用于 Android 设备,并且需要确保设备支持相应的功能。

python 复制代码
# 获取网络连接状态
connection_status = driver.network_connection
print(f"Current network connection status: {connection_status}")

返回的状态值是一个整数,它表示当前启用的网络类型组合。例如:

  • 0: No network (飞行模式)
  • 1: Airplane Mode (飞行模式)
  • 2: Wifi enabled
  • 4: Data enabled
  • 6: Wifi and Data enabled
设置手机网络连接状态

要设置设备的网络连接状态,可以使用 set_network_connection 方法。你需要传递一个表示所需网络类型的整数值或通过位运算组合多个网络类型。

python 复制代码
from appium.webdriver.connectiontype import ConnectionType

# 设置为仅开启Wi-Fi
driver.set_network_connection(ConnectionType.WIFI_ONLY)

# 设置为仅开启数据连接
driver.set_network_connection(ConnectionType.DATA_ONLY)

# 同时开启Wi-Fi和数据连接
driver.set_network_connection(ConnectionType.ALL_NETWORK_ON)

# 开启飞行模式(关闭所有网络)
driver.set_network_connection(ConnectionType.AIRPLANE_MODE)
示例代码

下面是一个完整的示例,展示了如何获取并设置设备的网络连接状态:

python 复制代码
from appium import webdriver
from appium.webdriver.connectiontype import ConnectionType

# 配置Desired Capabilities
desired_caps = {
    'platformName': 'Android',
    'deviceName': 'your_device_name',
    'appPackage': 'your_app_package',
    'appActivity': 'your_app_activity'
}

# 初始化WebDriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

try:
    # 获取当前网络连接状态
    current_connection = driver.network_connection
    print(f"Initial network connection status: {current_connection}")

    # 设置网络连接状态为仅Wi-Fi
    driver.set_network_connection(ConnectionType.WIFI_ONLY)
    print("Set network to WIFI_ONLY")

    # 重新获取网络连接状态以确认更改
    updated_connection = driver.network_connection
    print(f"Updated network connection status: {updated_connection}")

finally:
    # 结束会话
    driver.quit()
注意事项
  1. 权限:确保你的应用或者测试脚本有足够的权限来更改网络设置。
  2. 平台限制:上述方法主要用于 Android 平台。对于 iOS 平台,由于系统限制,直接修改网络设置的功能可能不被支持。
  3. Appium 版本:确保你使用的 Appium 版本支持这些功能,某些旧版本可能不完全支持所有的网络设置选项。

在使用 Appium 进行移动应用自动化测试时,press_keycode 方法可以用来模拟物理按键的按下操作。这对于需要与设备硬件交互的场景非常有用,比如按下音量键、返回键等。

按键操作

使用 press_keycode

press_keycode 方法允许你通过指定 Android 的键码来模拟按键操作。每个按键都有一个对应的键码值,这些值可以在 Android SDK 的 KeyEvent 类中找到。

示例代码

下面是一个简单的 Python 示例,展示了如何使用 press_keycode 来模拟按下某个按键:

python 复制代码
from appium import webdriver

# 配置Desired Capabilities
desired_caps = {
    'platformName': 'Android',
    'deviceName': 'your_device_name',
    'appPackage': 'your_app_package',
    'appActivity': 'your_app_activity'
}

# 初始化WebDriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

try:
    # 模拟按下返回键(键码为4)
    driver.press_keycode(4)
    print("Back button pressed")

    # 模拟按下Home键(键码为3)
    driver.press_keycode(3)
    print("Home button pressed")

    # 模拟按下音量加键(键码为24)
    driver.press_keycode(24)
    print("Volume up button pressed")

    # 模拟按下音量减键(键码为25)
    driver.press_keycode(25)
    print("Volume down button pressed")

finally:
    # 结束会话
    driver.quit()
常用键码

以下是一些常用的 Android 键码及其对应的按键:

  • 返回键4
  • Home键3
  • 菜单键82
  • 音量增加24
  • 音量减少25
  • 电源键26
  • 相机键27
  • 搜索键84

传递额外参数

有时候你可能需要传递额外的参数,比如 metastate(元状态),用于组合按键(如 Shift + A)。你可以通过传递额外的参数来实现这一点:

python 复制代码
# 按下组合键(例如Shift+A)
driver.press_keycode(29, metastate=64)  # 29 是 'A' 键,64 是左 Shift 键的状态
注意事项
  1. 确保设备连接 :确保你的设备已经正确连接,并且可以通过 adb devices 命令识别到。
  2. 权限问题:某些按键(如电源键)可能需要特殊的权限或设备处于解锁状态才能正常工作。
  3. Appium 版本:确保你使用的 Appium 版本支持这些功能,某些旧版本可能不完全支持所有的按键操作。
iOS 设备

对于 iOS 设备,由于系统限制,直接模拟物理按键的功能较少。不过,你可以使用其他方法来实现类似的效果,例如通过 execute_script 方法执行特定的 JavaScript 脚本来触发某些行为。

获取通知栏并进行操作

在使用 Appium 进行移动应用自动化测试时,直接操作通知栏并不是其核心功能之一。不过,Appium 提供了一些方法来与设备的通知系统进行交互,特别是在 Android 设备上。对于 iOS 设备,由于系统的封闭性和限制,直接通过 Appium 操作通知栏的功能较为有限。

在 Android 上打开通知栏

在 Android 上,你可以使用 open_notifications() 方法来打开通知栏,并与其中的通知进行交互。以下是如何使用 Python 和 Appium 来实现这一功能的详细步骤和示例代码。

示例代码

下面是一个完整的示例,展示了如何使用 open_notifications 方法来打开通知栏,并与特定的通知进行交互:

python 复制代码
from appium import webdriver

# 配置Desired Capabilities
desired_caps = {
    'platformName': 'Android',
    'deviceName': 'your_device_name',
    'appPackage': 'your_app_package',  # 如果需要启动一个特定的应用
    'appActivity': 'your_app_activity',  # 如果需要启动一个特定的应用
    'noReset': True  # 防止重置应用状态
}

# 初始化WebDriver
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

try:
    # 打开通知栏
    driver.open_notifications()
    print("Notifications panel opened")

    # 查找并点击某个特定的通知(假设通知文本包含 "Your Notification Text")
    notification = driver.find_element_by_xpath('//android.widget.TextView[contains(@text, "Your Notification Text")]')
    notification.click()
    print("Notification clicked")

    # 可以在此处添加更多操作,比如验证是否正确跳转到目标页面等

finally:
    # 结束会话
    driver.quit()
注意事项
  1. 确保通知存在:在尝试与通知交互之前,确保目标通知已经存在于通知栏中。可以通过手动触发通知或等待一段时间来确保通知已显示。

  2. 定位通知元素:通知栏中的元素可能具有动态内容,因此使用固定的资源ID可能不总是有效。通常情况下,可以使用文本内容(如上面示例中的 XPath)来定位通知。

  3. 权限问题:确保你的应用或测试脚本有足够的权限来访问通知栏。某些设备或系统版本可能需要额外的权限设置。

iOS 设备上的通知操作

对于 iOS 设备,由于系统的封闭性,直接通过 Appium 操作通知栏的功能非常有限。目前没有直接的方法可以通过 Appium 打开通知中心或与通知进行交互。不过,你仍然可以通过模拟用户的手势(例如从屏幕顶部向下滑动来打开通知中心),但这并不是直接操作通知的方式。

模拟手势打开通知中心(iOS)

尽管不能直接操作通知栏,但你可以尝试通过模拟手势来打开通知中心:

python 复制代码
from appium.webdriver.common.touch_action import TouchAction

# 创建TouchAction实例
action = TouchAction(driver)

# 从屏幕顶部向下滑动来打开通知中心
action.press(x=100, y=50).move_to(x=100, y=500).release().perform()

请注意,这种方法的效果可能因设备型号、屏幕尺寸以及 iOS 版本的不同而有所差异。

总结
  • Android :使用 driver.open_notifications() 方法可以直接打开通知栏,并通过标准的元素定位方法与通知进行交互。
  • iOS:由于系统限制,无法直接通过 Appium 操作通知栏,但可以通过模拟手势来尝试打开通知中心。
相关推荐
钢铁男儿4 小时前
一文掌握 Tombola 抽象基类的自动化子类测试策略
运维·自动化
痴人说梦梦中人4 小时前
SwaggerFuzzer:一款自动化 OpenAPI/Swagger 接口未授权访问测试工具
网络安全·渗透测试·自动化·api测试·漏洞利用·信息搜集
界面开发小八哥5 小时前
界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现数据库依赖?
ui·.net·界面控件·devexpress·ui开发·xaf
Kookoos13 小时前
Dynamics 365 Finance + Power Automate 自动化凭证审核
运维·自动化·dynamics 365·power automate
半导体守望者1 天前
ADVANTEST R3764 66 R3765 67爱德万测试networki connection programming网络程序设计手册
经验分享·笔记·功能测试·自动化·制造
Humbunklung1 天前
Rust Floem UI 框架使用简介
开发语言·ui·rust
东方佑1 天前
使用 Python 自动化 Word 文档样式复制与内容生成
python·自动化·word
会又不会1 天前
JMeter-SSE响应数据自动化2.0
jmeter·自动化
新加坡内哥谈技术1 天前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化
CodeCraft Studio2 天前
【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台
javascript·物联网·ui