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

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

1、APP界面信息获取

adb logcat|grep -i displayed

代码含义是获取当前应用的包名和界面名。
根据日志信息修改代码当中的包名和界面名,就可以跳转对应的界面。

2、界面元素获取

所需工具

在这里插入图片描述

下载链接

下载地址

安装步骤

安装教学地址

基本配置及入门操作指南

参考操作指南

3、APPium+Python的常规操作

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

元素获取方式

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

    element = driver.find_element_by_id("resource_id")
    
  2. 通过类名查找元素
    当你想通过元素的类名来定位它时,可以使用 find_elements_by_class_name 方法。

    elements = driver.find_elements_by_class_name("android.widget.EditText")
    
  3. 通过XPath查找元素
    XPath 是一种强大的路径语言,用于在 XML 文档中查找信息。同样适用于 HTML 和 XML 格式的 UI 层级结构。

    element = driver.find_element_by_xpath("//android.widget.TextView[@text='登录']")
    
  4. 通过Accessibility ID查找元素
    Accessibility ID 提供了一种独立于平台的方式标识元素,对于跨平台测试非常有用。

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

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

常用手势操作

1. 滑动(Swipe)

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

# 使用 TouchAction 实现滑动
from appium.webdriver.common.touch_action import TouchActionaction = TouchAction(driver)
action.press(x=100, y=200).move_to(x=100, y=500).release().perform()
2. 长按(Long Press)

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

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

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

# 对元素进行轻敲
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)
driver.execute_script('mobile: pinchOpen', {'scale': 2.0, 'velocity': -1})
  • 缩小(Pinch Close)
driver.execute_script('mobile: pinchClose', {'scale': 0.5, 'velocity': 1})

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

5. 拖拽(Drag and Drop)

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

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()

常规操作

  • 点击元素

    element.click()
    
  • 输入文本

    element.send_keys("Hello World!")
    
  • 清除文本

    element.clear()
    
  • 获取元素文本

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

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

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

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

获取手机网络连接状态

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

# 获取网络连接状态
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 方法。你需要传递一个表示所需网络类型的整数值或通过位运算组合多个网络类型。

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)
示例代码

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

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_connectionprint(f"Initial network connection status: {current_connection}")# 设置网络连接状态为仅Wi-Fidriver.set_network_connection(ConnectionType.WIFI_ONLY)print("Set network to WIFI_ONLY")# 重新获取网络连接状态以确认更改updated_connection = driver.network_connectionprint(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 来模拟按下某个按键:

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)。你可以通过传递额外的参数来实现这一点:

# 按下组合键(例如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 方法来打开通知栏,并与特定的通知进行交互:

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)

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

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 操作通知栏,但可以通过模拟手势来尝试打开通知中心。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…

初学总结SpringBoot项目在mac上环境搭建和运行

mac一定要安装上homebrew,这个玩意在mac上搭建环境贼拉好用,打开终端安装国内镜像的 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"1. brew安装maven brew install maven2.修改maven国内镜像 ma…

TCP/IP参考模型和网络协议

由于国防部担心他们一些重要的主机、路由器和互联网关可能会突然崩溃,所以网络必须实现的另一目标是网络不受子网硬件损失的影响,已经建立的会话不会被取消,而且整个体系结构必须相当灵活。 TCP/IP是一组用于实现网络互连的通信协议。Interne…

网络安全 | 安全信息与事件管理(SIEM)系统的选型与实施

网络安全 | 安全信息与事件管理(SIEM)系统的选型与实施 一、前言二、SIEM 系统的功能概述2.1 数据收集与整合2.2 实时监控与威胁检测2.3 事件响应与自动化2.4 合规性管理 三、SIEM 系统选型的关键因素3.1 功能需求评估3.2 可扩展性与性能3.3 易用性与可维…

Java中的分布式(概念说明)

1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…

简单了解应用层DNS协议

DNS(Domain Name System)协议是用于将人类可读的域名(如www.example.com)转换为计算机可识别的IP地址(如192.0.2.1)的系统。 TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便人们记…

Windows 找不到文件gpedit.msc,没有组策略编辑器,解决办法附上

windows10和11都通用。是不是有人告诉你家庭版本没有gpedit.msc,没有组策略编辑器?这压根就是某软玩的小把戏。Win10/11家庭版可通过修改文件后缀新建bat脚本,添加组策略包,以管理员身份运行后,输入gpedit.msc即可打开…

“PEP 8: W292 no newline at end of file“报错 IntelliJ IDEA自动添加空行问题

"PEP 8: W292 no newline at end of file"报错 IntelliJ IDEA自动添加空行问题 在使用IntelliJ IDEA的过程中,经常会发现不管是对于代码文件或者纯文本文件,在保存时中会在文件末尾加上一个空行,提交GIT对比检查时,总是…

线性数据结构解密:数组的定义、操作与实际应用

系列文章目录 01-从零开始掌握Python数据结构:提升代码效率的必备技能! 02-算法复杂度全解析:时间与空间复杂度优化秘籍 03-线性数据结构解密:数组的定义、操作与实际应用 文章目录 系列文章目录前言一、数组的定义与特点1.1 数组…

docker-compose.yml 详细教学

目录 文件结构 版本 服务(Services) 示例 文件结构 docker-compose.yml 文件通常包含以下几部分: version:指定 Docker Compose 文件的版本。services:定义应用程序中的服务,每个服务对应一个容器。vo…

spring 学习 (注解)

目录 前言 常用的注解 须知 1 Conponent注解 demo(案例) 2 ControllerServiceRepository demo(案例) 3 ScopeLazyPostConstructPreDestroy demo(案例) 4 ValueAutowiredQualifierResource demo(案例) 5 Co…

【设计模式】【行为型模式】迭代器模式(Iterator)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…

C语言-------结构体(1)

数据类型 (1)基本数据类型 整型 浮点型 字符型 (2)构造类型 数组 结构体 结构体: 用来处理,现实生活中,更复杂的数据的描述 用来 描述复杂数据的 一种用户自定义的数…

【centos7】安装redis

rpm链接:http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 下载remi源 wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 安装remi源 rpm -ivh remi-release-7.rpm 查找remi源中redis的版本 yum --enablereporemi list redis …

获取整十分钟时间戳的多种方法详解

在数据处理、定时任务等场景中,经常需要获取当前时间的整十分钟时间戳。本文将介绍两种常用方法,并拓展其他实现思路,帮助你灵活应对不同需求。 方法一:datetime模块计算法 原理:通过截断分钟数实现时间对齐。 代码实…

AcWing 798. 差分矩阵

题目来源: 找不到页面 - AcWing 题目内容: 输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将…

【Python爬虫①】专栏开篇:夯实Python基础

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

数仓:核心概念,数仓系统(ETL,数仓分层,数仓建模),数仓建模方法(星型模型,雪花模型,星座模型)和步骤

数仓建模的核心概念 事实表(Fact Table): 存储业务过程的度量值(如销售额、订单数量等)。 通常包含外键,用于关联维度表。 维度表(Dimension Table): 存储描述性信息&…

【靶机渗透实战】AI:WEB:1

靶机下载官网AI: Web: 1 ~ VulnHub 靶机描述 Difficulty: IntermediateNetwork: DHCP (Automatically assign)Network Mode: NATThis box is designed to test skills of penetration tester. The goal is simple. Get flag from /root/flag.txt. Enumerate the box, get low…

MATLAB中contains函数用法

目录 语法 说明 示例 查找文本 使用模式进行搜索 匹配列表中的任何文本 忽略大小写 确定字符向量中是否包含子字符串 contains函数的功能是确定字符串中是否有模式。 语法 TF contains(str,pat) TF contains(str,pat,IgnoreCase,true) 说明 如果 str 包含指定的模…