Appium_Xpath定位详解
做的笔记比较乱,定位过程中,发现很多开发小哥的代码命名问题,怕被怼,这里说说算了。
恩。。这是我最常用,也是最熟悉的定位方法之一,这次趁着UI交换变更的机会,整理一下Xpath的定位方法,喜欢可以收藏!
1、根据元素的属性 text、resource-id 、class、 content-desc属性定位
# text定位 1.可以通过text文本定位到 # driver.find_element_by_xpath("//*[@text='天猫国际']") # resource-id定位 2.如果元素id是唯一的,xpath也可以定位id属性 # 扫一扫 driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/bar_search']") time.sleep(4) driver.back() # class定位 3.class属性唯一的话,可以通过class属性定位到,定位class属性有两种方法 driver.find_element_by_xpath("//android.widget.EditText").click() time.sleep(4) driver.back() driver.find_element_by_xpath("//*[@class='android.widget.EditText']").click() # text定位 time.sleep(5) driver.back() driver.find_element_by_xpath("//*[@text='注册/登录']").click() time.sleep(5) # content-desc 4.定位content-des属性 driver.find_element_by_xpath("//*[@content-desc='帮助']").click()
2、contains模糊定位
.contains是模糊匹配的定位方法,对于一个元素的id或者text不是固定的,但有一部分是固定的,这种就可以模糊匹配
contains定位在定位一组元素的时候,效率尤其突出
# 模糊匹配 driver.find_element_by_xpath("//*[contains(@resource-id, 'bar_search')]").click() time.sleep(5) driver.back() # widget.EditText 搜索 driver.find_element_by_xpath("//*[contains(@class, 'widget.TextView')]").click() time.sleep(5) driver.back() # text 的 contains driver.find_element_by_xpath("//*[contains(@text, '注册/登录')]").click() time.sleep(5) driver.find_element_by_xpath("//*[contains(@text, '帮助')]").click()
3、匹配多个定位元素
# 匹配多个 duoge = driver.find_elements_by_xpath("//android.widget.TextView") # 返回是个list print("获取元素个数: %s" % len(duoge)) for i in duoge: print(i.text)
4、组合定位
如果一个元素有2个属性,通过xpath也可以同时匹配2个属性,text, resource-id,class,index,content-desc这些属性都能任意组合定位
# 通过2个属性组合定位 # id+class 淘宝搜索框 driver.find_element_by_xpath("//android.widget.EditText[@resource-id='com.taobao.taobao:id/home_searchedit']") # text+class 淘宝全部分类 driver.find_element_by_xpath("//*[@text='分类' and @class='android.widget.TextView']") # id+desc 淘宝扫一扫 driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/home_searchedit' and @content-desc='扫一扫']")
5、or 或者 and
# or 或者 and x = "//*[@text='' or @class='']" els = driver.find_elements_by_xpath(x) # 一般定位一组元素用到 for i in els: print(i.els)
6、层级定位-父子定位
知道父亲元素,也可以定位到子元素
# 父亲定位儿子 搜索框输入 # 有多个相同标签儿子,可以通过下标取值(xpath语法是从1开始数) driver.find_element_by_xpath('//android.webkit.WebView[@content-desc="安全验证"]/android.view.View[4]')
有多个相同标签儿子,可以通过下标取值(xpath语法是从1开始数)
7、儿子定位父亲
# 儿子定位父亲 sun_fa1 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/..' c = driver.find_element_by_xpath(sun_fa1).tag_name print(c) # 方法二 parent::* sun_fa2 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/parent::*' d = driver.find_element_by_xpath(sun_fa1).tag_name print(d) # 方法三 parent::android.widget.LinearLayout sun_fa3 = '//*[@resource-id="com.taobao.taobao:id/tv_scan_text"]/parent::android.widget.LinearLayout' e = driver.find_element_by_xpath(sun_fa1).tag_name print(e)
8、爷爷定位孙子
通过层级关系,一层一层的往下找,可以通过爷爷元素,定位到孙子元素
# 爷爷定位孙子 # 爷爷元素FrameLayout---第一个FrameLayout儿子---孙子TextView x = '//android.widget.FrameLayout/android.widget.LinearLayout[1]/android.widget.TextView' t = driver.find_elements_by_xpath(x) print(len(t)) # 打印文本信息 print(t[0].text)
作者:含笑半步颠√
博客链接:https://www.cnblogs.com/lixy-88428977
声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。
引用"虫师":生活依旧,工作依旧,学习依旧,趁着对技术还热情,继续学习与总结。