xpath
xpath本身是一套独立的技术,常用于web领域内。
此处uiautomator2也支持xpath,用于元素定位,可以实现复杂条件的元素的查找。
xpath常见操作
定位节点和操作节点
tbsNodeList = self.driver.xpath("//com.tencent.tbs.core.webkit.WebView").all()
xpath的all()返回的是XMLElement而不是XPathSelector
self.driver.xpath("//com.tencent.tbs.core.webkit.WebView")返回的是uiautomator2.xpath.XPathSelector
而加上了all()后
self.driver.xpath("//com.tencent.tbs.core.webkit.WebView").all()
则返回的是:uiautomator2.xpath.XMLElement的list了
即,每一个都是uiautomator2.xpath.XMLElement,而不是uiautomator2.xpath.XPathSelector
其中每一个都是uiautomator2.xpath.XMLElement
然后就可以去操作属性了:
获取属性content-desc的值
eachXmlElem.attrib.get("content-desc", "")
给属性content-desc设置值
eachXmlElem.attrib["content-desc"] = "add something to avoid NAF"
删除一个属性
eachXmlElem.attrib.pop("NAF")
文档
关于Xpath的详细用法,见官网中的:
其内部用的lxml,具体功能和语法都可以参考:
查找元素 相关函数
findAndClickNode:查找当前节点的父级符合条件的节点 并点击
def findAndClickNode(self, curNodeXpath):
"""
寻找可以clickable=true的当前或父级元素,并点击
注:主要用于当节点clickable=false,点击无效时,使用此方法
"""
foundAndClicked = False
matchDict = {"clickable": "true"}
clickableParentNode = self.findParentNode(curNodeXpath=curNodeXpath, matchDict=matchDict)
if clickableParentNode:
foundNodeAttrib = clickableParentNode.attrib
clickableParentNode.click()
foundAndClicked = True
logging.info("clicked element [%s] found by [xpath=%s, match=%s]", foundNodeAttrib, curNodeXpath, matchDict)
else:
logging.warning("Fail click %s for not found %s(parent) node", curNodeXpath, matchDict)
return foundAndClicked
调用:
if curNodeXpath:
foundAndClicked = self.findAndClickNode(curNodeXpath)
相关函数:
findParentNode:寻找父节点
def findParentNode(self, curNodeXpath, matchDict, maxUpLevel=3):
"""
寻找符合特定条件的父级节点,最多向上找3级
如果当前节点符合条件,则返回当前节点
"""
matchNode = None
try:
curNode = self.driver.xpath(curNodeXpath).get()
curNodeAttrib = curNode.attrib # .attrib contain 'clickable'
# curNodeInfo = curNode.info # .info not contain 'clickable'
isCurMatch = self.isMatchNode(curNodeAttrib, matchDict)
if isCurMatch:
# cu