Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)

news2024/10/5 12:43:09

1、 常用定位方法讲解

  对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象都没定位那么你想操作也不行。所以本章节的知识宏哥希望小伙伴们多动手去操作和实战,不要仅仅只是书本上的知识,毕竟这个我只能够举例说明。下面我们来看我们常用的一些定位方式。

1.1 ID定位

  无论是在web自动化还是app自动化中id都是唯一的,可能有的小伙伴看到这里会有疑问,因为有的资料说是通过name定位是唯一的,为什么你这里是id呢,其实这个在之前是不冲突的,但是如果你用的是appium较新版本是不行的,在新版本中name定位被去掉了,所以在以后的定位中不会有name定位了,通常情况下我们也更喜欢用id进行定位。这里可能刚学的小伙伴会有疑问,有的时候你的应用为什么没有id,或者说在这个手机上有但是另外的手机上没有。1、开发没有添加。2、android版本是4.4以下的。

我们直接看下面这张图片吧

 

上面图片中左边部分用红色圈出来的对象的id我们在右边的属性中可以看到,它的id宏哥同样是用红色圈出,如果我们需要对“请输入淘宝账户”这个输入框进行输入信息,我们只需操作右边的id就行,下面我们直接看代码。

1 driver.find_element_by_id("com.taobao.taobao:id/aliuser_login_account_et").send_keys("潇潇说测试")

通过上面的代码我们能够直接在账户信息输入框中输入账户信息北京潇潇说测试。可能对于无基础的人来说这里会又点儿迷糊,这个driver是哪里来的,driver在我们配置启动的时就已经初始化,我们只需要调用他的方法find_element_by_id。如果你的ide有自动补全功能,那么你在输入后面的方法时会发现一个问题,为什么还有一个find_elements_by_id呢?这个在后面会讲解,有兴趣的小伙伴可以思考一下。

1.2 className定位

在实际工作中className定位用得相对而言会比较少。当你经常去看class时你会发现很多的className是一样的,你没有办法对其进行唯一定位,下面我们看下面两张图片

我们可以仔细看一下这两张图片中淘宝账号、密码两个输入框中的className都是一样的,如果在这种情况下你使用下边这种方式去定位,你会发现你永远定位不了密码栏,这是为什么呢?因为在设计的时候如果你查找的元素在页面有多个,系统会自动给你选择第一个,所以你永远操作不了后面的,那么在实际工作或者实战的时候如果遇到此类问题如何解决这种问题呢?后面会讲解。

driver.find_element_by_class_name("android.widget.EditText").send_keys("潇潇说测试")

1.3 xpath定位

xpath定位在web自动化中是最常见的,而且也是最有效的,使用xpath定位避免了找不到元素导致报错的问题,但是在app中使用xpath定位是一件很low的事情。为什么这么说呢?因为在过来人的经历中只要遇见使用xpath定位元素他的反应就会比较慢,自动化的目的是为了提高效率,但是使用xpath后会降低效率,所以这里说很 low。但很多时候我们不得不去了解,下面我们大概讲解一下。首先我们要熟悉一下web的xpath定位。

1)讲web的xpath之前大家先装一下fireFox浏览器,再在浏览器中安装fireBug以及FirePath两个插件。如下图:

在自动化或者学习xpath时这两个插件是必不可少的,这里我们直接讲xpath,我们来看下面一张图片理解一下

用红色圈出有虚线的输入框我们看一下xFirePath给我们的定位,在定位的xpath中显示的是“.//*[@id='kw']”,这个是什么意思呢?我们来一步一步讲解。1、//*  选取文档中的所有元素 。2、@id='kw']  匹配属性为id且值为kw的节点。这里有的小伙伴可能不是很理解,说这里直接使用id进行定位就行。其实也是,但是当没有这个属性的时候呢?我们看下面这张图片

  name定位无效的情况下,当你看到这张图片的时候如果你不用xpath怎么定位呢?有一些抓狂的感觉吧。小伙伴可以尝试着自己使用xpath进行定位,可能有一些人发现xpath中定位不是很明白了,为什么呢?.//*[@id='u1']/a[4]  在这个xpath中我们没有像之前那样思路清晰了他多了一些层级关系,这个后面我们会仔细讲。这个xpath中首先第一步1、@id='u1'和之前的一样匹配属性为id值为ul的节点,然后再在他的下面进行定位第二步2、/a[4]  意思就是从根节点下选取第四个a元素。这样一步一步解析是否更加容易理解了呢?下面我们看一下在xpath定位中经常用到的一些语法,下来大家多多练习。

这个是我们经常用到的,而且是最基础的知识,只有这些没有办法完成很多古怪的需求,那么就有更难的,下面我们看下面的列表

上面这些知识都是在http://www.w3school.com.cn/xpath/xpath_examples.asp 里面,大家可以多看看,多练习。

下面我们直接看在app中xpath的使用

在上面两张图片中我们能够清除的看见他们的id、className都是一样的,这样的情况下不用层级定位方式我们只能够采用xpath来进行定位,首先根据前面web的学习大家可以思考一下该怎么定位。我们直接看代码

1 driver.find_element_by_xpath("//android.widget.TextView[@text='聚划算']").click()

在xpath里面我们的语法是这样“//android.widget.TextView[@text='JavaScript']”,这个和我们之前web的xpath一样,意思是查找所有节点中节点为android.widget.TextView (这里使用的是className,也可以使用id,系统会依次去找)并且他的text属性值为JavaScript,这样是否更容易理解呢?下来多练习。这样的定位方式不推荐,效率很慢。

2 、层级定位

2.1 什么是层级定位

  在前面的章节中我们已经提到了层级定位,只是不知道具体怎么操作而已。在很多的自动化中如果只是靠简单的定位是没有办法完成自动化的,就像刚xpath定位一样,有的元素的id、name、className都是一样的,xpath定位效率低下,这个时候我们大多数都会采用层级定位。

2.2 项目中层级定位如何运用

下面我们举一个简单的例子来理解层级定位。

从上面的图片我们可以看出id为com.taobao.taobao:id/rv_main_container的节点下面包含了很多的android.widget.FrameLayout

从下面的图片我们可以看出id为android.widget.FrameLayout的节点下面包含了很多的android.widget.LinearLayout

从这张图片我们不难看出,如果我们要定位这个元素我们是没办法去定位的,这种情况我们大多数使用的是层级定位以及xpath,这里我们来看如何使用层级定位。

首先我们可以看出三幅图的结构上的区别,第三幅图的元素它是在第二幅图里面的,第二幅图元素它是在第一幅图里面的,这里我们称第一幅图id(com.taobao.taobao:id/rv_main_container)为android.widget.FrameLayout的节点为第二幅图元素的父节点,第二幅图id(android.widget.FrameLayout)为android.widget.FrameLayout的节点为第三幅图元素的父节点,第一幅图id(com.taobao.taobao:id/rv_main_container)为android.widget.LinearLayout的节点为第三幅图元素的祖父节点;我们只需要先通过id定位到祖父节点,然后再从祖父节点往下面依次进行定位就好。现在你可以练习一下,看和我的结果一样吗?看代码:

1 element= driver.find_element_by_id("com.taobao.taobao:id/rv_main_container")
2 element1 = element.driver.find_elements_by_class_name("android.widget.FrameLayout")
3 element2 = element1[1].find_element_by_class_name("android.widget.LinearLayout")
4 element2.click()

按照思维我们的代码会是上面的结果,但是你去运行会发现不报错,可也不会点击,这个是为什么呢?我们看下面的图片(亲测,它会点击第一个天猫,可能是默认点击第一个吧)

在祖父节点下的所有子节点他的className都是“android.widget.FrameLayout”,在父节点下的所有子节点他的className都是“android.widget.LinearLayout”,这种情况下他怎么去点击操作呢?所以在这种情况下会引发一个新的定位问题,就是宏哥在接下来要讲的List定位。

2.3参考代码

 1 # coding=utf-8
 2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 # 2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-7-01
 7 @author: 潇潇说测试
 8 Project:学习和使用定位元素
 9 '''
10 # 3.导入模块
11 from appium import webdriver
12 import time
13 desired_caps = {}
14 desired_caps['platformName'] = 'Android'   #android的apk还是IOS的ipa
15 desired_caps['platformVersion'] = '8.0'  #android系统的版本号
16 desired_caps['deviceName'] = '127.0.0.1:62001'    #手机设备名称,通过adb devices  查看
17 desired_caps['appPackage'] = 'com.taobao.taobao'  #apk的包名
18 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome'  #apk的launcherActivity
19 #desired_caps['unicodeKeyboard'] = True   #使用unicodeKeyboard的编码方式来发送字符串
20 #desired_caps['resetKeyboard'] = True   #将键盘给隐藏起来
21 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #启动服务器地址,后面跟的是手机信息
22 # 休眠五秒等待页面加载完成
23 time.sleep(5)
24 
25 element= driver.find_element_by_id("com.taobao.taobao:id/rv_main_container")
26 element1 = element.find_elements_by_class_name("android.widget.FrameLayout")
27 element2 = element1[1].find_element_by_class_name("android.widget.LinearLayout")
28 element2.click()
29 
30 # driver.quit()

小结

1、前边介绍了一下火狐浏览器,这里宏哥再给小伙伴们总结一下谷歌浏览器如何用xpath定位,当然了,大神和大佬可以忽略不看,因为可以直接手写xpath定位。其实看看他们的语法也很简单,自己后期也可以尝试手写,看看和工具的有哪些区别,这样可以有助于自己的提高和提升。

2、谷歌浏览器xpath插件下载地址https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl

3、安装方法,用谷歌浏览器直接访问上边的地址,添加以后即可。

 4、看一下如何使用和其效果

(1)谷歌浏览器,F12,不可以的话,可以打开“开发者工具”

(2)点击左边的“箭头”,查找到要定位的元素

(3)选中控制台的元素,鼠标右键,在copy里,选中“Copy XPath”

(4)copy的内容:(//*[@id="kw"])

5、注意find_element和find_elements的区别!!!


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战


四、App自动化项目实战

五、一线大厂简历


六、测试开发DevOps体系

七、常用自动化测试工具


八、JMeter性能测试

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

资料获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片进群领取。

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

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

相关文章

AtcoderABC301场

A - Order Something Else A - Order Something Else 题目大意 计算 Takahashi 最少需要支付多少钱才能获得 AtCoder Drink。AtCoder Drink 可以按照原价 P 日元购买,也可以使用折扣券以 Q 日元的价格购买,但必须再额外购买 N 道菜品中的一道才能使用折…

Navicat代码片段存储位置

1、在Navicat的主界面中,选择“工具”——》“选项”——》文件位置,如下图 配置文件就是存放自动保存、代码片段等文件的位置,其中snippets(片段)就是自定义片段的存储位置了

【Android】在某个model中找不到自己的R资源的原因

背景 在某个新建的model为lib包的时候,我想在这个model内的activity引用R.string 等等资源,但是Android studio找不到。 解决 原来我之前误删了这个manifest中的 补齐包名即可。

Triton_server部署学习笔记

下载镜像 docker pill http://nvcr.io/nvidia/tritonserver:22.07-py3 docker run --gpus all -itd -p8000:8000 -p8001:8001 -p8002:8002 -v /home/ai-developer/server/docs/examples/model_repository/:/models nvcr.io/nvidia/tritonserver:22.07-py3 docker exec -it a5…

使用shell监控应用运行状态通过企业微信接收监控通知

目的:编写shell脚本来监控应用服务运行状态,若是应用异常则自动重启应用通过企业微信接收监控告警通知 知识要点: 使用shell脚本监控应用服务使用shell脚本自动恢复异常服务通过企业微信通知接收监控结果shell脚本使用数组知识,…

[黑苹果EFI]Lenovo ThinkPad T490电脑 Hackintosh 黑苹果引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件型号驱动情况 主板Lenovo ThinkPad T490 处理器Intel Intel Core i5 8265U (Quad Core)已驱动 内存16 GB:8 GB Samsung DDR 4 2666 Mhz *2已驱动 硬盘PC SN520 NVM…

maven项目使用java命令行运行类的main方式示例

因为需要测试一个东西,本地测试无问题,测试环境一直有问题,就想在测试环境测试下 直接写了个测试类,main方法直接运行测试逻辑 测试类写好,发现自己不会使用命令行运行 运行测试类一直报"错误: 找不到或无法加载主类" 折腾好久,终于找到两个帖子 记录下来,避免自己下…

Docker容器常用命令大全:熟练掌握使容器优化更加高效

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

mysql查询当天/昨天/近7天/近30天/本月/上个月/本季度/上季度/本年/上一年 数据

查询当天数据 select * from tab where FROM_UNIXTIME(fabutime, %Y%m%d) 20230717; mysql TO_DAYS(date) 函数 TO_DAYS(date) 给定一个日期date, 返回一个天数 (从年份0开始的天数 )。 mysql> SELECT TO_DAYS(950501); -> 728779 mysql查询今天、昨天、7天、近30天…

【Linux后端服务器开发】TCP协议

目录 一、TCP报头结构 二、确认应答机制 三、超时重传机制 四、连接管理机制 五、滑动窗口 六、拥塞控制 七、应答策略 一、TCP报头结构 TCP全称为传输控制协议(Transmission Control Protocol),数据在传输过程需要严格的控制 TCP协议…

CONNECT BY 介绍以及用法

CONNECT BY 介绍以及用法 CONNECT BY作用是,NNECT BY用来查询树形数据, CONNECT BY 语句的用法 语句格式: start with 条件A connect by prior orgid parentorgid 用法 情况1: start with 条件A connect by…

【树链】CF1702 G

Problem - G2 - Codeforces 题意: 思路: 首先,一条树链可以被分为两部分:左半部分和右半部分 我们可以把所有可能是链上的点排序,把深度最大的点默认成起点st,接下来去找终点ed ed在和st不同的链上 且 …

MSA【1】:Segment Anything Model for Medical Image Analysis: an Experimental Study

文章目录 前言1. Abstraction & Introduction1.1. Abstraction1.2. Introduction1.2.1. What is SAM?1.2.2. How to segment medical images with SAM? 2. Methodology2.1. SAM is used in the process of segmentation of medical images2.1.1. Semi-automated annotati…

【压力传感器】LPS22DFTR、LPS33KTR 绝对 压力,ADP5131 排气式压力计 50kPa 6-DIP

LPS22DFTR MEMS纳米压力传感器是一款超紧凑型压阻式绝对压力传感器,可用作数字输出气压计。LPS22DF的功耗更低,与上一代产品相比压力噪声更低。该器件包括一个传感元件和一个IC接口,通过I2C、MIPI I3CSM或SPI接口从传感元件向应用程序进行通信…

蒙德里安的梦想

题目 求把 NM 的棋盘分割成若干个 12 的长方形,有多少种方案。 例如当 N2,M4 时,共有 5 种方案。当 N2,M3 时,共有 3 种方案。 如下图所示: 输入格式 输入包含多组测试用例。 每组测试用例占一行&…

GO语言基础-04-数据类型-04-map(map的排序)

文章目录 1. 按value排序1.1 思路1.2 语法1.3 完整示例 2. 按key排序2.1 思路2.2 语法示例2.3 完整示例2.4 完整示例 1. 按value排序 1.1 思路 map本身的顺序不可控,我们考虑如下方法实现排队: 思路一:通过一个切片来接收拍好队的map成员思…

多线程应用场景

文章目录 前言一、CountDownLatch倒计时锁二、如何控制线程并发数?三、浅聊ThreadLocal1.ThreadLocal定义2.ThreadLocal源码解读3.关于ThreadLocal的一个案例 总结 前言 本篇介绍多线程中的应用场景,比如倒计时锁CountDownLatch、信号量Semaphore、以及…

【雕爷学编程】Arduino动手做(163)---大尺寸8x8LED方格屏模块5

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…

一种简化的3D点云车道线自动识别标注一些思考

0. 简介 作为3D车道线训练来说,数据集是至关重要的,而使用点云的精确性来完成准确的车道线地图构建是一个非常重要且有趣的事情。下面我们将会从一个例子开始,分阶段来告诉大家该怎么样去完成一个简单的3D点云车道线自动识别标注工具。 1. …

WordPress作为可扩展的企业级解决方案

网络商业世界就像一片汪洋大海,大型企业是大海中最大的鱼。然而,只因为你比其他人都大,并不意味着你不能逆流而上。相反,企业业务面临的挑战更大,对网站的技术要求更高。 多年来,大型公司通常依赖最昂贵的…