今天教大家如何针对app进行元素识别
-
先了解一下appium的工作原理
-
由上图可知:
appium支持多语言,因为它针对流的几种语言分别开发的相应的appium库。好处就是我们可以选择自己熟悉的语言编写appium脚本
appium支持多平台,包括MAC和Windows。它针对这两大平台开发了appium-Server
appium又同时支持Android 和 iOS两个操作系统,这就可以应用分别不同的移动设备上,覆盖市场上的大部分移动设备机型。
-
appium配置连接参数
那我们不多说废话了,直接开整,我这边连接的是真机,先查看一下设备的id
可以发现当前的设备id : c6c8c4ce
这个时候获取到了我们的设备id,接下来获取被测试的包名信息,通过反编译本地包的方法
aapt dumpsys badging 本地apk包名的位置
aapt dumpsys badging D:apkjisuanqi.apk
获取到了包名:rock.Simple.Calculator
活动入口名称:rock.Simple.Calculator.MainActivity
拿到这两个参数之后,我们离成功就不远了,终点就在前方 ,我们来解析一下连接appium远程的一些参数
# 首先要先下载 Appiunm-Python-Client 包 from appium import webdriver # 引入webdriver方法
des = {
"automationName": "Appium", # 默认是配置appium
"platformName": "Android", # 平台名称 ios/android/firefox Os
"platformVersion": "8.1.0", # 安卓的版本
"deviceName": "vivo x20", # 随便填 没关系
"app": "D:apkjisuanqi.apk",
"appPackage": "rock.Simple.Calculator", # 包名
"appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口
"udid": "c6c8c4ce", # adb连接的设备名称
"noSign": True,
"newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)
配置完这些我们就打开我们的appium,启动一下服务
服务启动完成
然后运行代码,观察日志,观察手机,发现运行完成,成功打开
-
appium识别元素
那我们现在会打开app了,那是不是就可以开始识别元素了呢? 对的,接下来教大家如何使用appium自带的元素识别工具
1.点击这个小放大镜
2.填入我们刚刚在代码里面的配置,不过不需要太多,只需要一下这些
2.添加参数信息
3. 然后点击start session,就会出现计算器的样子
-
appium元素定位
-
先说说绝对定位,比如我们要定位到【8】这个元素,会发现他有6层 不着急我们一层一层的写
from appium import webdriver des = { "automationName": "Appium", # 默认是配置appium "platformName": "Android", # 平台名称 ios/android/firefox Os "platformVersion": "8.1.0", # 安卓的版本 "deviceName": "vivo x20", # 随便填 没关系 "app": r"D:apkjisuanqi.apk", "appPackage": "rock.Simple.Calculator", # 包名 "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口 "udid": "c6c8c4ce", # adb连接的设备名称 "noSign": True, "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des) driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/' 'android.widget.LinearLayout/android.widget.LinearLayout[2]/' 'android.widget.LinearLayout[2]/android.widget.Button[2]').click()
可以发现我们这边定位到了六层之后,他就会点击8,这里需要注意的是,开头为什么要用双斜杠?
其实是因为它并不是顶级目录,上面还有一个目录,不信你可以自己试试去除双斜杠
-
使用属性定位
from appium import webdriver des = { "automationName": "Appium", # 默认是配置appium "platformName": "Android", # 平台名称 ios/android/firefox Os "platformVersion": "8.1.0", # 安卓的版本 "deviceName": "vivo x20", # 随便填 没关系 "app": r"D:apkjisuanqi.apk", "appPackage": "rock.Simple.Calculator", # 包名 "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口 "udid": "c6c8c4ce", # adb连接的设备名称 "noSign": True, "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des) driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/' 'android.widget.LinearLayout/android.widget.LinearLayout[2]/' 'android.widget.LinearLayout[2]/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="rock.Simple.Calculator:id/six_btn"]').click() # 点击6 # 使用bounds driver.find_element_by_xpath('//android.widget.Button[@bounds="[807,1458][1029,1958]"]').click() # 点击=
# 当然还有很多的方式,可以自己查阅一下其他资料
-
使用Xpath定位方法
from appium import webdriver des = { "automationName": "Appium", # 默认是配置appium "platformName": "Android", # 平台名称 ios/android/firefox Os "platformVersion": "8.1.0", # 安卓的版本 "deviceName": "vivo x20", # 随便填 没关系 "app": r"D:apkjisuanqi.apk", "appPackage": "rock.Simple.Calculator", # 包名 "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口 "udid": "c6c8c4ce", # adb连接的设备名称 "noSign": True, "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des) # # 以什么元素开头 '//类名[contains(@元素名,"内容")]' 这里没有元素好定位的 # driver.find_element_by_xpath('//android.widget.Button[contains(@元素,"xxxxx")]').click() # 元素包含某某内容 '//类名[contains(@元素名,"内容")]' driver.find_element_by_xpath('//android.widget.Button[contains(@resource-id,"six_btn")]').click() # 末尾开始匹配 '//类名[ends-with(@元素名,"内容")]' driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"one_btn")]').click()
-
uiautomator定位方法
appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator。
from appium import webdriver des = { "automationName": "Appium", # 默认是配置appium "platformName": "Android", # 平台名称 ios/android/firefox Os "platformVersion": "8.1.0", # 安卓的版本 "deviceName": "vivo x20", # 随便填 没关系 "app": r"D:apkjisuanqi.apk", "appPackage": "rock.Simple.Calculator", # 包名 "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口 "udid": "c6c8c4ce", # adb连接的设备名称 "noSign": True, "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des) # driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/' # 'android.widget.LinearLayout/android.widget.LinearLayout[2]/' # 'android.widget.LinearLayout[2]/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="rock.Simple.Calculator:id/six_btn"]').click() # 点击6 # # 使用bounds # driver.find_element_by_xpath('//android.widget.Button[@bounds="[807,1458][1029,1958]"]').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,"six_btn")]').click() # # 末尾开始匹配 '//类名[ends-with(@元素名,"内容")]' # driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"one_btn")]').click() # 点击 9 driver.find_element_by_android_uiautomator('text("9")').click() # 点击9 新建一个UiSelect对象 driver.find_element_by_android_uiautomator('resourceId("rock.Simple.Calculator:id/nine_btn") ').click()
# 点击8 driver.find_element_by_android_uiautomator('new UiSelector().resourceId("rock.Simple.Calculator:id/eight_btn")').click()
后续更新...