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;//线序…

【动态规划】LeetCode-746LCR 088.使用最小花费爬楼梯

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

微软 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调试助手四、…

HarmonyOS开发(八):动画及网络

1、动画概述 在ArkUI中,产生动画的方式是改变组件属性值并且指定相关的动画参数。当属性值发生变化后,按照动画参数,从原来的状态过渡到新的状态,就形成一个动画。 动画的相关参数如下: 属性名称 属性类型 默认值 …

解压指定路径下的压缩文件(zip),将相同名字的数据(csv)合并到一起

import os import zipfile import pandas as pddef merge_csv_files(zip_folder, output_folder):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历指定路径下的所有zip文件for zip_file in os.listdir(zip_folder):if zip_file.en…

C语言KR圣经笔记 4.1函数基础

第4章 函数 函数将大的计算任务拆分成小份,还能让我们在他人已完成的基础上开发,而不必从头开始。恰当的函数隐藏了程序中那些不需要知道操作细节的部分,这样就使整体更加清晰,并且能减少修改的痛苦。 C的设计使得函数的使用高效…

2023-12-01 事业-代号s-引流技巧和营销思路

摘要: 2023-12-01 事业-代号s-引流技巧和营销思路 引流技巧和营销思路 独立站流量渠道主要有以下几种:1、CPC付费广告:搜索引擎、社交平台、广告联盟平台。2、网红营销:youtube、INS、博客论文、TT直播。适合比较时尚品类3、Affiliate促销网站:优惠券折扣网站发布产品优惠…

miot-plugin-sdk. npm install安装失败

miot-plugin-sdk-npm install安装失败 最紧公司要开发一台智能设备,经过同事的对比,选中了米家作为云平台,于是,我就负责开发app界面端,根据官方文档教程 下载了miot-plugin-sdk 程序,准备开始开发,结果悲…

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;存放系统启动和恢复所需的基本命令&#…