• uiautomatorviewer介绍
    • 操作uiautomatorviewer
      • 定位app界面
  • Appnium
    • Appnium操作
      • Appium元素识别
    • Appium元素定位
      • Xpath
        • 绝对路径
        • 属性定位
        • 部分属性定位
    • uiautomator元素定位
      • text
      • resourceId
      • className
      • contenet-des
      • 根据元素关系定位
        • 后代元素定位
        • 兄弟元素定位
    • 手机H5页面识别
  • 总结
    • 代码地址
    • 博客园地址

uiautomatorviewer介绍

元素定位主要用来获取元素信息,获取元素信息后才能用appium提供的相关API去识别和操作元素。谷歌在AndroidSDK中,提供了元素定位工具uiautomatorviewer,该工具可在android-sdk安装路径下找到:

<android-sdk>\tools\bin\uiautomatorviewer.bat

博主的是在这个路径下

D:\Android\android-sdk-windows\tools

操作uiautomatorviewer

打开之后是这样的

定位app界面

使用步骤:

1、在虚拟机或真机上打开要识别的app
2、在命令窗口输入uiautomatorviewer命令
3、然后点击DeviceScreenshot按钮连接手机


问题不大 让我小小的操作一波

步骤一:

# 搜索到app.uix
adb shell uiautomator dump /sdcard/app.uix
# 存放在本地的路径
adb pull /sdcard/app.uix D:\Android

步骤二:

# 搜索图片
adb shell screencap -p /sdcard/app.png
# 保存图片到本地
adb pull /sdcard/app.png D:\Android\app.png

本地文件夹路径存放文件

做完以上操作,然后我们导入这两个文件

导入之后就可以识别app的页面元素了,不过用的人都比较少了,一个是软件不太行,对部分机型不兼容,一个是操作起来不太友好,所以我们下面介绍Appnium

Appnium

之前其实我们已经介绍过appnium的操作原理了,接下来再来复习一下


appium支持多平台,包括MAC和Windows。它针对这两大平台开发了appium-Server
appium又同时支持Android 和 iOS两个操作系统,这就可以应用分别不同的移动设备上,覆盖市场上的大部分移动设备机型。

所以我们话不多说接着来操作

Appnium操作

  • 先获取设备id
adb services

  • 获取包名
adb shell dumpsys window | findstr mCurrentFocus


包名

  mCurrentFocus=Window{c854f2d u0 com.android.calculator2/com.android.calculator2.Calculator}
  • 打开Appnium

  • 打开Pycharm新建demo
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0", # 系统版本"deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2",  # 包名"appActivity": "com.android.calculator2.Calculator", # 活动包名"udid": "192.168.0.101:5555", # 设备的编号"noReset": "True","unicodeKeyboard": "True", "resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

运行代码之后,会自动打开我们的计算器app

  • 代码图示

Appium元素识别

首先我们进入到这个页面,然后点击这个小搜索按钮

  • 填写参数 然后点击start session


然后我们就进入到了识别元素的界面

  • 可以根据右边的表示来进行元素的获取

Appium元素定位

app的定位方法跟我们之前学习的UI类似,下面将讲述一下相关的定位方式

Xpath

绝对路径

元素的全路径,包含了全部节点。这种方法写起来很长,效率不高;另一方面由于涉及到太多层,一旦中间任何一层有变动,那元素就定位不到了

假定元素位于第8个位置,上面从第一个1位置起直到第7个位置的所有路径必须都要写,且第7个位置上有很多个元素,我们可以用下标来表示[2]

  • 代码图示

这里需要注意的是,开头为什么要用双斜杠?
其实是因为它并不是顶级目录,上面还有一个目录,不信你可以自己试试去除双斜杠,看看点击的是什么

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)
# 绝对定位
driver.find_element_by_xpath('//android.widget.FrameLayout/android.widget.FrameLayout''/android.widget.FrameLayout/android.view.ViewGroup''/android.widget.LinearLayout/android.widget.LinearLayout[2]''/android.view.ViewGroup[1]/android.widget.Button[2]').click()
  • 代码图示

属性定位

举例:

text属性:
driver.find_element_by_xpath(’//类名[@text=text值]’)

resource-id属性: 等同于id
driver.find_element_by_xpath(’//类名[@resource-id=属性值]’)

content-desc属性:
driver.find_element_by_xpath(’//类名[@content-desc=属性值]’)

class属性:
driver.find_element_by_xpath(’//类名’)

多属性:and表示并且or表示或者
driver.find_element_by_xpath(’//类名[@属性名=属性值and/or@属性名=属性值]’)

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)# 绝对定位
driver.find_element_by_xpath('//android.widget.FrameLayout/android.widget.FrameLayout''/android.widget.FrameLayout/android.view.ViewGroup''/android.widget.LinearLayout/android.widget.LinearLayout[2]''/android.view.ViewGroup[1]/android.widget.Button[2]').click()# 使用text属性定位  '//属性值[@text=""]'
driver.find_element_by_xpath('//android.widget.Button[@text="+"]').click()  # 点击+号
# 使用resource-id  '//属性值[@resource-id=""]'
driver.find_element_by_xpath('//android.widget.Button[@resource-id="com.android.calculator2:id/digit_6"]').click()  # 点击6
# 使用bounds
driver.find_element_by_xpath('//android.widget.Button[@bounds="[1184,2482][1412,2764]"]').click()  # 点击=
  • 代码图示

部分属性定位

使用部分属性内容定位:当元素的属性值过长或者元素属性值内容中存在动态变化的情况下,可以使用该方法。

起始位置匹配:
starts-with()driver.find_element_by_xpath(’//类名[starts-with(@属性名,部分属性值)]’)
包含匹配:
contains()driver.find_element_by_xpath(’//类名[contains(@属性名,部分属性值)]’)
末尾位置匹配:
ends-with()driver.find_element_by_xpath(’//类名[ends-with(@属性名,部分属性值)]’)

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)driver.find_element_by_xpath('//android.widget.FrameLayout/android.widget.FrameLayout''/android.widget.FrameLayout/android.view.ViewGroup''/android.widget.LinearLayout/android.widget.LinearLayout[2]''/android.view.ViewGroup[1]/android.widget.Button[2]').click()# # 以什么元素开头    '//类名[contains(@元素名,"内容")]'  这里没有元素好定位的
# driver.find_element_by_xpath('//android.widget.Button[contains(@元素,"xxxxx")]').click()
# 元素包含某某内容   '//类名[contains(@元素名,"内容")]'
driver.find_element_by_xpath('//android.widget.Button[contains(@resource-id,"digit_6")]').click()
# 末尾开始匹配   '//类名[ends-with(@元素名,"内容")]'
driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"eq")]').click()
  • 代码图示

uiautomator元素定位

appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。

在代码实现上提供的API是

find_element_by_android_uiautomator

text

  • 举例
# 方式一
find_element_by_android_uiautomator('text("值")')
# 方式二
find_element_by_android_uiautomator('newUiSelector().text("值")')
  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)driver.find_element_by_android_uiautomator('text("7")').click()
driver.find_element_by_android_uiautomator('text("+")').click()
# 两种方法均可使用
driver.find_element_by_android_uiautomator('new UiSelector().text("7")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("=")').click()
  • 代码图示

resourceId

  • 举例
# 方式一
find_element_by_android_uiautomator('resourceId("值")')
# 方式二
find_element_by_android_uiautomator('newUiSelector().resourceId("com.android.calculator2:id/eq")')
  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)driver.find_element_by_android_uiautomator('resourceId("com.android.calculator2:id/digit_7")').click()
driver.find_element_by_android_uiautomator('resourceId("com.android.calculator2:id/op_add")').click()
# 两种方法均可使用
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/digit_7")').click()
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/eq")').click()
  • 代码图示

className

  • 举例:
# 方式一
find_element_by_android_uiautomator('className("值")')
# 方式二
find_element_by_android_uiautomator('newUiSelector().className("com.android.calculator2:id/eq")')
  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)driver.find_element_by_android_uiautomator('className("android.widget.ImageButton")').click()#driver.find_element_by_android_uiautomator('newUiSelector().className("android.widget.ImageButton")').click()

contenet-des

  • 举例
driver.find_element_by_accessibility_id("contenet-desc的值").click()driver.find_element_by_android_uiautomator('new UiSelector().description("contenet-desc的值")').click()
  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01import time
from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)driver.find_element_by_android_uiautomator('text("7")').click()
time.sleep(1)
driver.find_element_by_android_uiautomator('text("8")').click()
time.sleep(1)
driver.find_element_by_android_uiautomator('text("9")').click()driver.find_element_by_accessibility_id("删除").click()driver.find_element_by_android_uiautomator('new UiSelector().description("删除")').click()
  • 代码图示

根据元素关系定位

后代元素定位

后代元素定位使用条件:
子元素属性不定,不唯一,只能通过父元素来定位

  • 举例
newUiSelector().resourceId("父元素值").childSelector(className("子元素值").instance(数字))其中childSelector可以传入resourceId、description等方法instance表示匹配的结果所有元素里面的第几个元素,从0开始计数
  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01import time
from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)#  点击数字9
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.android.calculator2:id/pad_numeric").''childSelector(className("android.widget.Button").instance(2))').click()

兄弟元素定位

通过子元素找到父元素,然后通过父元素再去找兄弟元素

  • 举例
# 是兄弟就来砍我  表示从元素的父元素下查找
driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("8"))').click()
  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01import time
from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","udid": "192.168.0.101:5555","noReset": "True","unicodeKeyboard": "True","resetKeyboard": "True"
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)# #  点击数字9 父元素定位
# driver.find_element_by_android_uiautomator(
#     'new UiSelector().resourceId("com.android.calculator2:id/pad_numeric").'
#     'childSelector(className("android.widget.Button").instance(2))').click()# 兄弟元素点击
driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("8"))').click()
  • 代码图示

手机H5页面识别

H5网页是指第5代HTML,也指用H5语言制作的一切数字产品。HTML5的设计目的是为了在移动设备上支持多媒体。目前很多网站都做了自适应,通过不同端打开呈现不同的网页效果。appium支持在手机端对web网页进行UI自动化操作。

appium对手机端web网页进行自动化操作步骤如下:

1、手机端安装google浏览器apk
2、查看google浏览器apk版本,下载与之对应的appium-webdriver程序
3、把下载的appium-webdriver程序替换appium默认的webdriver程序
4、设置DesiredCapabilities时,增加’browserName’、'chromedriverExecutable’参数,去掉app启动相关参数,

注意:chrome浏览器需要安装在设备当中,虚拟器不能安装chrome.apk,推荐用真机进行测试

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01import time
from appium import webdriverdes = {"platformName": "Android","platformVersion": "9.0","deviceName": "Samsung Galaxy S9","browserName": "Chrome","udid": "192.168.0.101:5555","noReset": "True","chromedriverExecutable": r"D:\apk\chromedriver.exe", # 驱动地址
}driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
time.sleep(3)
# 语法跟ui自动化一样
driver.find_element_by_xpath("//*[@id='index-kw']").send_keys("newdream")
driver.find_element_by_id('index-bn').click()

利用谷歌浏览器开发者工具切换到手机模式后再去识别

1、在谷歌浏览器输入待测网站
2、进入菜单–更多工具–开发者工具,点击toggledevicetoolbar,切换到手机模式
3、刷新网站,此时会切换到手机版网页模式,点击开发者工具左上角选择元素按钮,再到待测网页中去点击元素识别。
1:选择元素按钮
2:toggledevicetoolbar

总结

  • 本章总结

    本章节主要讲到的appnium如何进行元素定位,以及两个定位元素的工具

代码地址

https://gitee.com/todayisgoodday/PythonAppnium

博客园地址

https://www.cnblogs.com/yushengaqingzhijiao/category/2024559.html

Python+Appium【第三章】Adb元素定位相关推荐

  1. python第三章课后答案_XX医学院本科各专业《Python》第三章习题与答案-2020年实用精品...

    XX医学院本科各专业<Python>第三章习题与答案 一.填空题 1.python语言提供.和3种数字类型.(整数.浮点数.复数) 2.整数类型有4种进制表示,默认情况采用十进制,二进制数 ...

  2. python课本第三章答案idle_第三天任务 (【基于Python编程从入门到实践】第三章 列表 书本及动手试一试)...

    3.1列表什么是列表 列表是由 一系列特定顺序排列的元素组成的 用方括号[]来表示列表 并用逗号来分隔其中的元素 访问列表元素 索引指定访问的列表元素 使用列表中的各个值 3--1 动手试一试 3.1 ...

  3. python基础代码事例-python基础第三章

    第三章主要讲解Python的print语句的应用和赋值语句,代码块与缩进,条件语句,循环语句.这几种基础的语句 Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者 ...

  4. 零基础学Python(第三章 基础语法)

    本套学习内容共计[22]个章节,每个章节都会有对应的从0-1的学习过程详细讲解,希望可以给更多的人提供帮助. 开发环境:[Win10] 开发工具:[Visual Studio 2019] 1.第一个 ...

  5. Python程序设计第三章测验总结

    第三章 顺序和分支程序应用 3.1 猜数字与二分法 1.如果需要提前结束循环,可以使用: A.break B.continue C.else D.if 解:A 2.语句x=input()执行时,如果从 ...

  6. Appium移动端自动化测试之元素定位(三)

    1.name定位 driver.find_element_by_id('com.shanjian.originaldesign:id/edit_Tel').send_keys('15817252876 ...

  7. python基础第三章选择结构答案-零基础学Python--------第3章 流程控制语句

    第3章 流程控制语句 3.1程序的结构 计算机在解决某个具体问题时,主要有3种情况,分别是顺序执行所有的语句.选择执行部分语句和循环执行部分语句.程序设计中的3种基本结构为顺序结构.选择结构和循环结构 ...

  8. [转载] python机器学习第三章:使用scikit-learn实现机器学习分类算法

    参考链接: 使用Scikit-Learn在Python中进行embedding/投票分类 训练机器学习算法所涉及的五个主要步骤可以概述如下: 1.特征的选择 2.确定性能评价标准 3.选择分类器及其优 ...

  9. appium微信公众号分类元素定位方法

    appium自动化遇到定位分类中的元素,开始以为切换分类是一个新的页面,一直定位元素都提示元素不可交互,原因是实际上三个分类中的元素都是一个前端页面展示,你去切换分类定位第二个分类里元素,实际上定位的 ...

最新文章

  1. 洛谷p1162填涂颜色(dfs写法)
  2. javaOOP项目实战——银行ATM机
  3. 数学建模中的matlab实例,matlab数学建模实例
  4. mysql forget the password
  5. 属性文件有一个多行值
  6. OAuth2.0授权流程分析
  7. 【分享】虹软人脸识别应用开发过程
  8. java中week of year_Java WeekFields weekOfYear()用法及代码示例
  9. module ‘tensorflow_core.compat.v1‘ has no attribute ‘contrib‘问题的完美解决
  10. 【ARDUINO】HC-05蓝牙不配对问题
  11. java 快速排序 递归_Java递归快速入门
  12. Pandas Index 属性
  13. git操作本地仓库基本使用教程
  14. php服务端setcookie()原理
  15. 所有手机品牌型号大全_【干货】史上最全SMT贴片机品牌、型号大全,赶紧看看你会几种???...
  16. 房地产主数据管理全周期实践[转]
  17. Shell 进阶指南
  18. CNAS仪器校准人员需要遵守哪些规范?
  19. 关于contiki中的Ctimer和Etimer
  20. 奥巴马,别让底特律变成你的越南

热门文章

  1. 解释SQL和NoSQL
  2. java c 速度_Java和C#运行速度对比:Java比C#快约3倍
  3. Linux mysql 内存设置_MYSQL在LINUX机器(4G内存)配置参数
  4. k8s实现nginx-ingress通过统一IP访问服务无缝对接生产上游Nginx
  5. 2008年8月5号,晴,今天天气开始变热了。业精于勤,荒于嬉。—— 韩 愈《进学解》
  6. systemverilog中实现饱和截位和饱和截位的分析
  7. MySQL中查询和删除重复行
  8. 史上最全的python的web开发和网络编程【附属详细解释+案例】
  9. (已解决)RedisTemplate写入数据 \xAC\xED\x00\x05t\x00 序列化问题
  10. 电影评论系统C语言,如何写出一篇真正的电影评论?——《如何写影评》