智能终端界面自动化测试操作工具 - Appium常见用法
1. Appium 是什么可以做什么?
Appium 是一款开源的移动应用自动化测试框架,用于测试移动应用程序的功能和用户界面。它支持多种移动平台,包括 Android 和 iOS,可以使用多种编程语言进行脚本编写,如 Python、Java、JavaScript 等。
简单理解,Selenium是用于桌面系统的Web界面自动化测试框架,Appium是在智能终端,如Android Apple iPhone iPad等手机设备上,自动访问控制手机,在相关App上进行自动化测试操作。
2. Appium 依赖软件包安装
在使用 Appium 进行 Android 自动化测试之前,需要安装以下依赖软件和工具:
-
Java Development Kit (JDK): Appium 是基于 Java 开发的,因此需要安装 JDK。你可以从 Oracle 官方网站下载适用于你的操作系统的 JDK 版本,并按照官方指南进行安装。
-
Android SDK: Android SDK 提供了 Android 平台的开发工具和 API,用于构建和运行 Android 应用程序。你可以从 Android 开发者网站下载 Android SDK,并按照指南进行安装。
-
Node.js: Appium 是使用 Node.js 编写的,因此需要安装 Node.js 运行环境。你可以从 Node.js 官方网站下载适用于你的操作系统的 Node.js 版本,并按照官方指南进行安装。
-
Appium Server: Appium Server 是 Appium 的核心组件,用于驱动设备或模拟器,并提供与移动应用的通信接口。你可以从 Appium 官方网站下载 Appium Server,并按照指南进行安装。
-
Appium Python 客户端库: 如果你选择使用 Python 编写 Appium 脚本,需要安装 Appium Python 客户端库。你可以使用 pip 命令在命令行中安装 Appium Python 客户端库,如下所示:
pip install Appium-Python-Client
- Android 虚拟设备或真机: 为了运行和测试 Android 应用程序,你需要准备一个 Android 虚拟设备(模拟器)或连接一台 Android 真机设备,并确保设备已启用开发者选项和 USB 调试功能。
确保安装和配置正确后,你将能够开始编写和运行 Appium 脚本来自动化测试 Android 应用程序。
3. 启用Android设备的开发者选项和USB调试功能
开始编写自动化测试脚本之前,需要连接手机,启用 Android 设备的开发者选项和 USB 调试功能:
-
打开设备的设置(Settings):在 Android 设备上,滑动下拉通知栏,然后点击右上角的设置图标,或者在应用程序列表中找到并点击设置应用程序图标。
-
查找设备信息(About Phone 或 About Device):在设置中,向下滚动或浏览列表,找到 “关于手机” 或 “关于设备” (可能会有轻微的差异),然后点击进入该选项。
-
查找设备版本号:在设备信息中,查找 “版本号” 或 “软件信息”。通常,你需要点击 “版本号” 字段七次或更多次,直到出现一个提示表示开发者选项已经启用。
-
返回设置并找到开发者选项:返回到设置界面,在设置列表的末尾或在其他选项下,你将看到 “开发者选项”。点击进入该选项。
-
启用开发者选项:在开发者选项页面,找到并点击开关按钮或复选框,将其从 “关闭” 改为 “打开” 或 “启用”。这将启用开发者选项。
-
启用 USB 调试:在开发者选项页面,滚动或浏览列表,找到 “USB 调试” 选项,并勾选复选框以启用 USB 调试功能。
完成上述步骤后,你的 Android 设备将启用开发者选项和 USB 调试功能。现在你可以使用 Appium 或其他工具与设备进行连接,并进行 Android 自动化测试。请注意,不同的 Android 设备可能会有略微不同的界面和选项标签,但基本上遵循相似的步骤。
4. Appium常见用法
当使用 Appium 和 Python 进行移动应用自动化测试时,以下是一些常见的代码示例,涵盖元素定位、操作和断言等方面:
- 启动应用程序并连接到 Appium 服务器:
from appium import webdriverdesired_caps = {'platformName': 'Android','deviceName': 'Android Emulator','appPackage': 'com.example.app','appActivity': 'com.example.app.MainActivity'
}driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
- 通过 ID 定位元素并进行点击操作:
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素出现
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((MobileBy.ID, 'com.example.app:id/button')))# 点击按钮
element.click()
- 通过 XPath 定位元素并输入文本:
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素可见
wait = WebDriverWait(driver, 10)
text_input = wait.until(EC.visibility_of_element_located((MobileBy.XPATH, '//android.widget.EditText[@text="Username"]')))# 输入文本
text_input.send_keys('John Doe')
- 滑动屏幕:
from appium.webdriver.common.touch_action import TouchAction# 获取屏幕尺寸
screen_size = driver.get_window_size()
start_x = int(screen_size['width'] * 0.5)
start_y = int(screen_size['height'] * 0.8)
end_x = int(screen_size['width'] * 0.5)
end_y = int(screen_size['height'] * 0.2)# 滑动屏幕
action = TouchAction(driver)
action.press(x=start_x, y=start_y).move_to(x=end_x, y=end_y).release().perform()
- 断言元素的文本内容:
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 等待元素出现
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((MobileBy.ID, 'com.example.app:id/text_view')))# 断言文本内容
expected_text = 'Hello, Appium!'
actual_text = element.text
assert expected_text == actual_text
这些示例演示了常见的 Appium Python 代码用法,包括启动应用程序、定位元素、进行操作和断言验证。你可以根据具体的应用程序和测试需求进行相应的修改和扩展。请注意,这些示例中的元素定位方式和元素的标识符(如 ID、XPath)可能因应用程序的不同而有所变化,需要根据实际情况进行调整。
5. 简单代码示例 - 通过Chrome访问csdn
from appium import webdriver
import time# Appium服务器地址和设备配置
desired_caps = {'platformName': 'Android','platformVersion': 'your_android_version','deviceName': 'your_device_name','browserName': 'Chrome',
}
appium_server = 'http://localhost:4723/wd/hub'# 创建Appium WebDriver实例
driver = webdriver.Remote(appium_server, desired_caps)
driver.implicitly_wait(10)# 打开Google Chrome浏览器并访问网址
print("打开Google Chrome浏览器")
driver.get('https://blog.csdn.net/')
time.sleep(2)# 找到搜索框并输入关键字
print("在搜索框中输入关键字: Entropy-Go")
search_box = driver.find_element_by_id('search_input')
search_box.send_keys('Entropy-Go')# 提交搜索表单
print("提交搜索表单")
submit_button = driver.find_element_by_id('search_button')
submit_button.click()
time.sleep(2)# 打开搜索结果的第一个网页
print("打开搜索结果的第一个网页")
first_result = driver.find_element_by_css_selector('div.search-list-con > dl > dt > a')
first_result.click()
time.sleep(2)# 关闭浏览器并退出
driver.quit()
相关文章:
智能终端界面自动化测试操作工具 - Appium常见用法
1. Appium 是什么可以做什么? Appium 是一款开源的移动应用自动化测试框架,用于测试移动应用程序的功能和用户界面。它支持多种移动平台,包括 Android 和 iOS,可以使用多种编程语言进行脚本编写,如 Python、Java、Jav…...
结构体数组经典运用---选票系统
结构体的引入 1、概念:结构体和其他类型基础数据类型一样,例如int类型,char类型,float类型等。整型数,浮点型数,字符串是分散的数据表示,有时候我们需要用很多类型的数据来表示一个整体&#x…...
code too large
描述:比较尴尬,一个方法的代码接近10000行了,部署服务器的时候提示(java :code[255,21] too large),提示代码过长,无法运行。 查看了一下百度:解决的思路 JVM规范:「类或接口可以声明的字段数量限制在 655…...
vue中把弹出层.vue文件注册成组件供其他.vue文件调用的写法
背景:因弹出层多个页面的详情都是一样的,因此把弹出层定义成组件,多次调用 定义组件的过程中出现很多问题,因此再次记录最终成功的写法 一、 简单实现页面调用弹出层组件的打开弹出层方法: 1. 弹出层组件 (in…...
mac 查看GPU使用
首先搜索活动监视器 然后 点击窗口->gpu历史记录 记住不是立马出结果,而是 需要等半分钟左右的...
工业4.0的安全挑战与解决方案
在当今数字化时代,工业4.0已经成为制造业的核心趋势。工业4.0的兴起为生产企业带来了前所未有的效率和灵活性,但与之伴随而来的是一系列的安全挑战。本文将深入探讨工业4.0的安全挑战,并提供一些解决方案,以确保制造业的数字化转型…...
如何查找特定基因集合免疫基因集 炎症基因集
温故而知新,再次看下Msigdb数据库。它更新了很多内容。给我们提供了一个查询基因集的地方。 关注微信:生信小博士 比如纤维化基因集: 打开网址:https://www.gsea-msigdb.org/gsea/msigdb/index.jsp 2.点击search 3.比如我对纤维…...
轮转数组(Java)
大家好我是苏麟 , 这篇文章是凑数的 ... 轮转数组 描述 : 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 题目 : 牛客 NC110 旋转数组: 这里牛客给出了数组长度我们直接用就可以了 . LeetCode 189.轮转数组 : 189. 轮…...
Spring体系结构
Spring体系结构 核心容器 核心容器由 spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Spring 表达式语言,Spring Expression Language)等模块组成&…...
PostgreSQL basebackup备份和恢复
一、概述 备份和恢复分为逻辑和物理,这里指物理备份和恢复。 PG的物理备份依赖basebackup,这差不多就是数据目录的拷贝,还依赖归档日志。 恢复分为完全恢复和PITR恢复,它们都需要归档日志,它们关键的差别是…...
XTU-OJ 1248-Alice and Bob
Alice和Bob在玩骰子游戏,他们用三颗六面的骰子,游戏规则如下: 点数的优先级是1点最大,其次是6,5,4,3,2。三个骰子点数相同,称为"豹子",豹子之间按点数优先级比较大小。如果只有两个骰子点数相同&…...
第四章 文件管理 十、文件系统的全局结构
目录 一、文件系统的建立 1、原始磁盘 2、物理格式化后 3、逻辑格式化后 二、文件系统在内存中的结构 三、系统调用背后的过程 一、文件系统的建立 1、原始磁盘 2、物理格式化后 物理格式化,即低级格式化――划分扇区,检测坏扇区,并用…...
【PythonGIS】基于高德Api实现批量地址查询经纬度
之前因为同事需要几千个小区的经纬度信息,所以就帮同事写了一段Python代码,通过调取高德地图的api实现地址查询经纬度这个功能。对于如何使用经纬度查询地址的方法,我之前分享过博文:【Python入门教程】获取图片可视化精准定位&am…...
vue数组中的变更方法和替换方法
变更方法: Vue 能够侦听响应式数组的变更方法,并在它们被调用时触发相关的更新。这些变更方法包括: push():在数组末尾添加一个或者多个元素,返回新的长度。 var arr [1, 2, 3, 4, 5]; // 定义一个数组 arr.push(6…...
Java - 工具类参数初始化
在做第三方接口调用时,经常需要根据不同的环境指定初始化的参数。以下做一个简单的记录。 一、使用static初始化 使用static初始化,仅会初始化一次,但无法从配置文件中获取参数。并且如果写了多个初始化工具类,会互相覆盖。 /**…...
一文搞懂 MineCraft 服务器启动操作和常见问题 2023年10月
文章目录 前言1. 新建文件夹2. 创建 bat 文件3. 编辑 bat 文件4. 启动服务器5. 恭喜完成 文章持续更新中,如果你有问题可以通过 qq 1317699264 获取免费协助,解决的问题将会被更新到本文章中 前言 无论你是使用服务端整合包,还是从上一篇我的…...
第2篇 机器学习基础 —(2)分类和回归
前言:Hello大家好,我是小哥谈。机器学习中的分类和回归都是监督学习的问题。分类问题的目标是将输入数据分为不同的类别,而回归问题的目标是预测一个连续的数值。分类问题输出的是物体所属的类别,而回归问题输出的是数值。本节课就…...
Java游戏修炼手册:2023 最新学习线路图
前言 有没有一种令人兴奋的学习方法?当然有!绝对有!而且我要告诉你,学习的快乐可以媲美游戏的刺激。 小学时代,我曾深陷于一款名为"八百万勇士的梦"的游戏。每当放学,我总是迫不及待地打开电脑&a…...
前端访问geoserver服务发生跨域的解决办法,以及利用html2canvas下载绘制的地图
我的业务场景: 需要利用html2canvas下载Openlayers绘制的地图。 预期:可以下载成图片甚至其他格式(svg)文件。 结果:下载下来是个空白图片。 排查错误:请求数据正常回显到页面上,利用html2canvas截取的时候会发生跨域,导致无法绘制。 首先处理tomcat跨域问题 第一步…...
Word docx转html和markdown
Pypandoc使用pandoc来进行各种文本格式的转换。 安装 # 不带pandoc执行库 pip install pypandoc# 自带pandoc pip install pypandoc_binary使用 import pypandoc# convert all markdown files in a chapters/ subdirectory. pypandoc.convert_file(chapters/*.md, docx, out…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...
