如果你有了上一篇关于xpath的知识, 关于手机界面元素的识别因该就不难了.
https://blog.csdn.net/lxy210781/article/details/81814038
首于我们要了解到,手机界面各个元素是有一个xml布局文件的,如果我们能得到当前界面的布局xml文件,就能通过xml文件来识别界面的元素状态了。
为什么要了解界面元素的状态呢?比喻说当你用adb命令点击了一个屏幕上的勾选框时,有时候点中并不会生效并没有勾上,你还想多点击一下,那怎么知道这个勾选框元素点击后有没有生效被打上勾呢?就adb命令而言,是不知道无法获取的,结合上面说到的几点,要想获得元素的状态必须有几个条件:
1. 当前界面的xml文件
2. 通过此xml文件了解到要check的点的条件,即查看当前待查看元素状态的条件(当前是透过xpath来查找).
好了,直接写吧:
def isExistElementValue(query, value, deviceid = ''):
'''
因为adb shell来执行是没有办法去判断界面元素的执行状态。
而有时又必须要判断当前的执行状态,则要用到这个函数.
常用命令:
adb shell uiautomator dump /sdcard/ui.xml
adb pull /sdcard/ui.xml ./Desktop/
http://web.chacuo.net/formatxml
'''
from lxml import etree
if deviceid == '':
xmlfilename = 'ui.xml'
uixmlfile = 'adb shell uiautomator dump /sdcard/' + xmlfilename
pulluixmlToDesktop = 'adb pull /sdcard/' + xmlfilename + ' C:\\Users\\' + getusername() + '\\Desktop\\'
print(pulluixmlToDesktop)
else:
xmlfilename = deviceid + '.xml'
uixmlfile = 'adb -s ' + deviceid + ' shell uiautomator dump /sdcard/' + xmlfilename
pulluixmlToDesktop = 'adb -s ' + deviceid + ' pull /sdcard/' + xmlfilename + ' C:\\Users\\' + getusername() + '\\Desktop\\'
print(pulluixmlToDesktop)
# 保存当前界面xml并pull至桌面
os.system(uixmlfile)
os.system(pulluixmlToDesktop)
# 打开xml文档
tree = etree.parse('C:\\Users\\' + getusername() + '\\Desktop\\' + xmlfilename)
result = tree.xpath(query)[0]
print(f'result:{result}')
if result == value:
return True
else:
return False
# 应用举例:
if __name__ == '__main__':
# 当前界面upswipeQuery查找的组件条件是唯一的,我们要查看index的值.
upswipeQuery = '//node[@index="4"]/@index'
if isExistElementValue(upswipeQuery, '4') == True:
print('找到了:)')
else:
print('未找了:(')