Appium 元素定位与常用方法,让你轻松玩转自动化测试!

对测试人来说,Appium 是非常重要的一个开源跨平台自动化测试工具,它允许测试人员在不同的平台(iOS、Android 等)使用同一套 API 来写自动化测试脚本,这样可大幅提升代码复用率和工作效率。

本文汇总了从 Appium 基础到自动化测试高级实战中,所涉及到的方方面面的知识点精华内容(如下所示),希望对大家快速总结和复习有所帮助。

Appium 从基础到自动化测试框架实战
  1. Appium 基础 1(环境搭建和简介)

  2. Appium 基础 2(元素定位和元素常用方法)

  3. Appium 基础 3(手势操作和 uiautomator 查找元素)

  4. Appium 基础 4(显式等待)

  5. Appium 基础 5(toast 和参数化)

  6. Appium 基础 6(webview)

  7. Appium_ 企业微信练习 (非 PO,增加和删除联系人)

  8. Appium_ 企业微信练习 (PO--增加联系人)

Appium 环境搭建

JDK 的搭建
  • 下载 1.8 的 jdk

  • 新建环境变量:JAVA_HOME 值为:D:\Program Files\Java\jdk1.7.0

  • 新建环境变量:CLASSPATH 值为:.;%JAVA_HOME%\lib;(注意:点号表示当前目录,不能省略)

  • 在系统变量 Path 的值的前面加入以下内容:%JAVA_HOME%\bin

SDK 的配置
  • 下载 sdk

  • 打开 sdk 的 sdk manager,安装 tools 前 3 个东西和 google 的 usb 驱动

  • 配置 Android home 里面的 platform-tools 和 tools

Appium 的搭建
  • 安装 node.js,配置 node.js 的环境变量

  • npm install -g cnpm --registry=https://registry.npm.taobao.org

  • cnpm install -g appium

  • cnpm install -g appium-doctor

  • pip install appium-python-client

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

appium 运行的 python 代码
  • mumu 连接 adb 是:adb connect 127.0.0.1:7555

from appium import webdriver#设置 caps 的值
desire_cap= {#默认是 Android"platformName":"android",#adb devices 的 sn 名称"deviceName":"127.0.0.1:7555",#包名"appPackage":"com.xueqiu.android",#activity 名字"appActivity":".view.WelcomeActivityAlias"
}#运行 appium,前提是要打开 appium server
driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",desire_cap)

Appium 的简介

Appium 的引擎
  • Android 是 uiautomator2

  • ios 是 xcuitest

Appium 的设计理念
  • webdriver 是基于 http 协议的,第一连接会建立一个 session 会话,并通过 post 发送一个 json 告知服务端相关测试信息

  • client/server 设计模式

  • 客户端通过 webdriver json wire 协议与服务器通讯

  • 多语言支持

  • server 可以放在任何地方

  • 服务器 nodejs 开发的 http 服务

  • appium 使用 appium-xcuitest-driver 来测试 iphone 设备,其中需要安装 Facebook 出的 WDA(webdriver agent) 来驱动 ios 测试

Appium 的生态工具
  • adb:Android 控制工具

  • appium Destkop:内嵌 appium server 和 inspector 的综合工具

  • appium server:appium 的核心工具,命令行工具

  • appium client:各种语言的客户端封装库,用户连接 appium server,包含 python、java、ruby 等

  • appcrawler 自动遍历工具

获取 App 的信息
  • 获取当前元素界面:adb shell dumpsys activity top

  • 获取任务列表:adb shell dumpsys activity activities

  • 获取 app 的 package 和 activity:adb shell;然后 logcat | grep -i displayed

  • 启动应用:adb shell am start -W -n "com.xueqiu.android/.view.WelcomeActivityAlias -S

Capability 设置
  • 文档地址:http://appium.io/docs/en/writing-running-appium/caps/index.html

  • platformName:android 通常都是写 android

  • deviceName:127.0.0.1:7555 这个通常是 adb devices 的名称

  • appPackage:com.xueqiu.android 这个是 app 的 package 包名

  • appActivity:.view.WelcomeActivityAlias 这个是 app 的 activity 名

  • noReset:true, false 是否重置测试的环境(例如首次打开弹框,或者登陆信息)

  • unicodeKeyboard:true, false 是否需要输入非英文之外的语言并在测试完成后重置输入法,比如输入中文

  • dontStopAppOnReset:true, false 首次启动的时候,不停止 app

  • skipDeviceInitialization:true, false 跳过安装,权限设置等操作

测试用的 apk
  • https://github.com/appium/appium/tree/master/sample-code/apps

Android 的基础知识

Android 的布局
  • Android 是通过容器的布局属性来管理子控件的位置关系,布局过程就是把界面上的所有的控件,根据他们的间距的大小,摆放在正确的位置

  • 线性布局:LinearLayout

  • 相对布局:RelativeLayout

  • 帧布局:FrameLayout

  • 绝对布局:AbsoluteLayout

  • 表格布局:TableLayout

  • 网格布局:GirdLayout

  • 约束布局:ConstraintLayout

Android 四大组件
  • activity:与用户交互的可视化界面

  • service:实现程序后台运行的解决方案,比如 qq 音乐的音乐在后台运行,没有界面

  • content provide:内容提供者,提供程序所需要的数据,比如?提供数据库?

  • broadcast receiver:广播接收器,监听外部事件的到来(比如来电)

Android 常用的控件
  • TextView:文本控件

  • EditText:可编辑文本控件

  • Button:按钮

  • ImageButton:图标按钮

  • ToggleButton:开关按钮

  • ImageView:图片控件

  • CheckBox:复选框控件

  • RadioButton:单选框控件

控件知识
  • dom:Document Object Model 文档对象模型

  • dom 应用:最早应用于 html 和 js 的交互,用户表示界的控件层级,界面的结构化描述,常见的格式为 html、xml。核心元素为节点和属性

  • xpath:xml 路径语言,用于 xml 中的节点定位

  • Android 的应用层级结构是定制的 xml

  • app source 类似于 dom,表示 app 的层级,表示界面里面所有的控件数的结构

  • 每个控件都有它的属性(resourceid、xpath、aid),没有 css 属性

Appium 的元素定位

普通方式的定位
  • driver.find_element_by_accessibility_id() 对应 content-desc

  • driver.find_element_by_id() 对应 resource-id

  • driver.find_element_by_name() 对应 text

  • driver.find_element_by_xpath() 对应 xpath

By 的定位方式
  • 首先要 from appium.webdriver.common.mobileby import MobileBy as By

  • self.driver.find_element(By.ID,"") 对应 resource-id

  • self.driver.find_element(By.XPATH,"") 对应 xpath

  • self.driver.find_element(By.ACCESSIBILITY_ID,"") 对应 content-desc

  • self.driver.find_element(By.NAME,"") 对应 text

Xpath 的定位方式
  • driver.find_element_by_xpath("//*[@text=' 扫一扫 ']")

  • driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/tv_scan_text']")

  • driver.find_element_by_xpath("//*[@content-desc=' 帮助 ']")

  • driver.find_element(By.XPATH,"//*[@resource-id='com.xueqiu.android:id/name' and @text=' 阿里巴巴 ']") and 的使用

  • 父类和兄弟类的方法://[@text=' 性别 ']/..//[@text=' 男 ']。其中 /.. 表示父类,//* 就是兄弟,孙子等类

  • //*[Contains(@text,"tong")] 这是 xpath 的 text 模糊搜索的方法

元素的方法

元素的常用方法
  • 点击方法:element.click()

  • 输入操作:element.send_keys("tong")

  • 设置元素的值:element.set_value("tongtong")

  • 清除操作:element.clear()

  • 是否可见:element.is_displayed 返回 true or false

  • 是否可用:element.enabled() 返回 true or false

  • 是否被选中:element.is_selected() 返回 true or false

  • 获取属性值:element.get_attribute(name)

属性值介绍
  • get_attribute(name) 获取的属性名称和 uiautomatorviewer 的一致,但是 index 的值获取不了

  • 真假获取的值是 true 和 false 的字符串,并不是 python 的 boolean 值

元素常用的属性
  • 获取元素文本:element.text

  • 获取元素坐标:element.location

  • 结果:{'y':19,'x':498}

  • 获取元素尺寸(高和宽):element.size

  • 结果:{'width':500,'height':22}

实战小案例 1
  1. 打开雪球 app

  2. 点击搜索输入框

  3. 向搜索输入框输入 “阿里巴巴”

  4. 在搜索的结果里选择阿里巴巴,然后点击

  5. 获取这只上香港 阿里巴巴的股价,并判断这只股价的价格>200

代码
from time import sleep
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy as Byclass TestFind():#设置 caps 的值def setup(self):self.desire_cap= {#默认是 Android"platformName":"android",#adb devices 的 sn 名称"deviceName":"127.0.0.1:7555",#包名"appPackage":"com.xueqiu.android",#activity 名字"appActivity":".view.WelcomeActivityAlias","noReset":"true","unicodeKeyboard":True}#运行 appium,前提是要打开 appium serverself.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)self.driver.implicitly_wait(5)def test_search(self):"""1. 打开雪球 app2. 点击搜索输入框3. 向搜索输入框输入 “阿里巴巴”4. 在搜索的结果里选择阿里巴巴,然后点击5. 获取这只上香港 阿里巴巴的股价,并判断这只股价的价格>200:return:"""sleep(3)#点击搜索框self.driver.find_element(By.ID,"com.xueqiu.android:id/tv_search").click()#向搜索框输入阿里巴巴self.driver.find_element(By.ID,"com.xueqiu.android:id/search_input_text").send_keys(" 阿里巴巴 ")#找到搜索框预览结果的阿里巴巴,并点击self.driver.find_element(By.XPATH,"//*[@resource-id='com.xueqiu.android:id/name' and @text=' 阿里巴巴 ']").click()#选择 HK 股价的元素prices=self.driver.find_elements(By.ID,"com.xueqiu.android:id/current_price")[1]#提取股价的 text 属性price=float(prices.text)#判断股价是否大于 200assert price > 200
实战小案例 2
  1. 打开雪球首页

  2. 定位首页的搜索框

  3. 判断搜索框是否可用,并查看搜索框 name 属性值

  4. 打印搜索框这个元素的左上角坐标和它的宽高

  5. 向搜索框输入:alibaba

  6. 判断阿里巴巴是否可见

  7. 如果可见,打印搜索成功点击,如果不可见,打印搜索失败

代码
from time import sleep
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy as Byclass TestFind():#设置 caps 的值def setup(self):self.desire_cap= {#默认是 Android"platformName":"android",#adb devices 的 sn 名称"deviceName":"127.0.0.1:7555",#包名"appPackage":"com.xueqiu.android",#activity 名字"appActivity":".view.WelcomeActivityAlias","noReset":"true","unicodeKeyboard":True}#运行 appium,前提是要打开 appium serverself.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)self.driver.implicitly_wait(5)def test_element_function(self):"""1. 打开雪球首页2. 定位首页的搜索框3. 判断搜索框是否可用,并查看搜索框 name 属性值4. 打印搜索框这个元素的左上角坐标和它的宽高5. 向搜索框输入:alibaba6. 判断阿里巴巴是否可见7. 如果可见,打印搜索成功点击,如果不可见,打印搜索失败:return:"""sleep(8)#找到搜索框的元素search=self.driver.find_element(By.ID, "com.xueqiu.android:id/tv_search")#当搜索框是可用(类似可点击)后才进行下面的操作,is_enabled() 返回 Ture or Falseif search.is_enabled():#打印搜索框的 text 值print(search.text)#打印搜索框左上角的坐标print(search.location)#打印搜索框的高和宽print(search.size)#点击搜索框,才可以进行下面的操作search.click()#在搜索框中输入阿里巴巴self.driver.find_element(By.ID, "com.xueqiu.android:id/search_input_text").send_keys(" 阿里巴巴 ")#定义找到预览结果的阿里巴巴的元素alibaba=self.driver.find_element(By.XPATH, "//*[@resource-id='com.xueqiu.android:id/name' and @text=' 阿里巴巴 ']")#当 alibaba 元素可见,打开搜索成功,否则打印搜索失败if alibaba.is_displayed():print(" 搜索成功 ")else:print(" 搜索失败 ")

更多内容,我们在后续文章分享。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

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

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

相关文章

Python列表切片操作详解:提取、复制、反转等应用示例

更多资料获取 📚 个人网站:ipengtao.com 在Python中,列表切片是处理列表数据非常强大且灵活的方法。本文将全面探讨Python中列表切片的多种用法,包括提取子列表、复制列表、反转列表等操作,结合丰富的示例代码进行详细…

直饮水表与智能水表有哪些区别?

随着科技的不断进步,智能家居的概念正逐渐深入人们的生活。其中,直饮水表和智能水表作为创新科技的代表,在水资源的使用和管理方面发挥了重要作用。然而,这两者之间存在一些关键的区别。那么,直饮水表与智能水表到底有哪些区别呢? 直饮水表和智能水表都是…

java+springboot学生宿舍公寓管理系统xueshenggongy

经过查阅资料和调查统计发现,高校学生宿舍管理工作变得越来越繁重和琐碎,如在学生住宿安排(特别是新生住宿安排)、宿舍大幅调换、公共设施统计维护、宿舍杂费统计收取、宿舍卫生管理统计、出入登记记录等各个方法存在着大量问题和…

【Python 训练营】N_14 文件查找和替换

题目 新建一个test3.txt文件,内容如下图,然后从中查找字符串’five’,并统计出现的次数;替换其中的’five’字符串为’python’。 分析 类似Excel中的查找和替换,查找相应内容需用到正则,还考察文件打开、…

Leecode 【一】

环形链表: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…

以太网PHY,MAC接口

本文主要介绍以太网的 MAC 和 PHY,以及之间的 MII(Media Independent Interface ,媒体独立接口)和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看,以太网接口电路主要由MAC(M…

二叉树展开为链表的三种写法

二叉树展开为链表 链表头节点法 新建一个树形链表,前序遍历这个树,遍历到一个节点就往里插 class Solution {TreeNode dummyNode new TreeNode(0,null,null);TreeNode p dummyNode;public void flatten(TreeNode root) {if(root null) return;//线序…

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践(一)

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践 Power Pages 网页搭建 微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践1、Power Pages 介绍2、开始创建一个站点3、选择一个合适的模板4、编辑我们的模板5、面向专业开发人员的高级开发功能6、预览…

深搜回溯剪枝优化策略-全排列II

LCR 084. 全排列 II - 力扣(LeetCode) 这道题的主体思想和之前讲过的全排列是相似的,不同的是思考的角度要侧重于剪枝方向,所以可以通过这道题对剪枝思想的进一步扩展; 通过题意,可以知道,在上一…

STM32CubeIDE(CUBE-MX hal库)----蓝牙模块HC-05(详细配置)

系列文章目录 STM32CubeIDE(CUBE-MX hal库)----初尝点亮小灯 STM32CubeIDE(CUBE-MX hal库)----按键控制 STM32CubeIDE(CUBE-MX hal库)----串口通信 STM32CubeIDE(CUBE-MX hal库)----定时器 文章目录 系列文章目录前言一、蓝牙配置二、CUBE-MX可视化配置三、蓝牙APP调试助手四、…

PMIC : 一颗芯片解决N多问题

1、什么是PMIC Power Management Integrated Circuit(PMIC)中文是电源管理集成电路,主要特点是高集成度,将传统的多路输出电源封装在一颗芯片内,使得多电源应用场景高效率更高,体积更小。 PMIC 是当今电子…

嵌入式基础电路设计和常用芯片用法

文章目录 一、基础电路1. 按键电路2. 晶振电路3. 降压电路 二、常见芯片1. SN74HC244PWR2. TLP23623. ACS7244. LM3585. EL357-NB6. SMBJ30CA 一、基础电路 1. 按键电路 观察以上电路可知: 在按键SW1不按下的时候引脚BTN1是接着3V3的,所以默认为高电平…

windows判断端口是否在使用的bat脚本

脚本 REM 查询端口是否占用 netstat -ano|findstr 3306 >nul &&echo y >1.log ||echo n >1.log REM 读取文本内容赋值给变量 set /P resu<1.log if %resu% y (echo port in use ) else (echo port not in use ) mysql服务不运行的时候检测效果 mysql服…

Linux体系架构----Linux根目录下常见一级子目录的作用

文章目录 Linux 根目录下的一级子目录扮演着重要的角色&#xff0c;每个子目录都有其特定的作用和功能。以下是常见的 Linux 根目录下一级子目录及其作用&#xff1a; /bin&#xff08;Binary&#xff09;&#xff1a; 作用&#xff1a;存放系统启动和恢复所需的基本命令&#…

基于SpringBoot高校心理教育辅导设计与实现

摘 要 随着Internet技术的发展&#xff0c;心理教育辅导系统应运而生&#xff0c;心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以&#xff0c;为了充分满足高校学生心理教育辅导的需求&#xff0c;特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…

真实的软件测试日常工作是咋样的?

最近很多粉丝问我&#xff0c;小姐姐&#xff0c;现在大环境不景气&#xff0c;传统行业不好做了&#xff0c;想转行软件测试&#xff0c;想知道软件测试日常工作是咋样的&#xff1f;平常的工作内容是什么&#xff1f; 别急&#xff0c;今天跟大家细细说一下一个合格的软件测…

WordPress:解决xmlrpc.php被扫描爆破的风险

使用WordPress的朋友都知道&#xff0c;一些【垃圾渣渣】会利用xmlrpc.php文件来进行攻击&#xff0c;绕过WP后台错误登录次数限制进行爆破。虽然密码复杂的极难爆破&#xff0c;但及其占用服务器资源。 方法一、利用宝塔防火墙&#xff08;收费版&#xff09; 一般可以直接使…

MySQL锁篇

目录 一、MySQL中的锁 1.1、全局锁 1.2、表级锁 1.2.1、表锁 1.2.2、元数据锁&#xff08;MDL&#xff09; 1.2.3、意向锁 1.2.4、AUTO-INC 锁 1.3、行级锁 1.3.2、Gap Lock 1.3.3、Next-Key Lock 1.3.4、插入意向锁 二、MySQL 是怎么加锁的&#xff1f; 2.1、为什…

使用ttyd为你的Anroid设备提供web版控制台

嵌入式Android设备&#xff0c;众所周知要调试要开adb&#xff0c;涉及到安全问题通常要走一系列流程&#xff0c;非常复杂&#xff0c;对于维护人员要求比较高。因此考虑有没有一个方便的调试手段。 此外&#xff0c;我们还需要考虑x86的嵌入式设备的方案&#xff0c;最好有类…

四、C语言数据类型和变量

目录 1. 数据类型介绍 1.1 字符型 1.2 整型 1.3 浮点型 1.4 布尔类型 1.5 各种数据类型的长度 1.5.1 sizeof 操作符 1.5.2 数据类型长度 2. signed 和 unsigned 3. 数据类型的取值范围 4. 变量 4.1 变量的创建 4.2 变量的分类 5. 算术操作符&#xff1a;、-、*、…