0
点赞
收藏
分享

微信扫一扫

Python+Appium【第三章】Adb元素定位

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_01

from appium import webdriver

des = {
  "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_01


from appium import webdriver

des = {
    "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()

  • 代码图示
    在这里插入图片描述

属性定位

举例:

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01


from appium import webdriver

des = {
    "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()  # 点击=
  • 代码图示
    在这里插入图片描述

部分属性定位

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

  • 示例代码
# -*- coding: utf-8 -*-
# @Time : 2022/1/14 10:46
# @Author : Limusen
# @File : demo_connect_01


from appium import webdriver

des = {
    "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()
  • 代码图示
    在这里插入图片描述

总结

  • 本章总结

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

博客园地址

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

举报

相关推荐

0 条评论