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

本文主要是介绍Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入

简介

  你有道灵光从天灵盖喷出来你知道吗,年纪轻轻就有一身横练的筋骨,简直百年一见的练武奇才啊,如果有一天让你打通任督二脉,那还不飞龙上天啊。正所谓我不入地狱谁入地狱,警恶惩奸维护世界和平这个任务就交个你了,好吗。这本如来神掌秘籍是无价之宝,我看与你有缘,收你十块钱传授给你吧。想必这段经典台词给为都可以的耳熟能详吧,宏哥,没这么牛叉呼啦带闪电,就是希望对你有帮助就可以了。

  上一篇宏哥给小伙伴们介绍完定位工具这两个异性兄弟,这篇就给小伙伴们介绍一下定位方法。早就有小伙伴问,这个这个怎么定位,那个那个怎么定位?那么宏哥今天就告诉你,怎么怎么定位。其实定位前边也有所涉及,只不过是一笔带过的。这篇宏哥就给小伙伴们详细的介绍一下。

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-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-7-017 @author: 北京-宏哥   QQ交流群:7076992178 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的区别!!!

  好了,时间不多了,天也很晚了,大致就这些吧,今天就给小伙伴们就说到这里吧。

宏哥不能保证所整理都符合大家的口味,但我能保证每一篇都是用心去写和用心去整理,我始终认同“分享的越多,你的价值增值越大”,欢迎大家关注我的博客和个人公众号的技术分享。在分享中进步,越努力越幸运,期待我们都有美好的明天!

有的小伙伴们等不急了,留言催宏哥了,不好意思哈,宏哥说实话最近特变的忙,没时间更新,这还是点灯熬油赶了一篇,能力有限,希望大家喜欢!!!

支持宏哥的朋友们和宏哥的宏粉记得点波推荐哦,您的肯定就是我进步的动力。鄙人先在这里给您道谢了,谢您嘞~~

   每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

这篇关于Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069564

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP