作的筆記比較亂,定位過程當中,發現不少開發小哥的代碼命名問題,怕被懟,這裏說說算了。android
恩。。這是我最經常使用,也是最熟悉的定位方法之一,此次趁着UI交換變動的機會,整理一下Xpath的定位方法,喜歡能夠收藏!web
一、根據元素的屬性 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()
二、contains模糊定位學習
.contains是模糊匹配的定位方法,對於一個元素的id或者text不是固定的,但有一部分是固定的,這種就能夠模糊匹配spa
contains定位在定位一組元素的時候,效率尤爲突出code
# 模糊匹配 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()
三、匹配多個定位元素blog
# 匹配多個 duoge = driver.find_elements_by_xpath("//android.widget.TextView") # 返回是個list print("獲取元素個數: %s" % len(duoge)) for i in duoge: print(i.text)
四、組合定位element
若是一個元素有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='掃一掃']")
五、or 或者 andget
# or 或者 and x = "//*[@text='' or @class='']" els = driver.find_elements_by_xpath(x) # 通常定位一組元素用到 for i in els: print(i.els)
六、層級定位-父子定位
知道父親元素,也能夠定位到子元素
# 父親定位兒子 搜索框輸入 # 有多個相同標籤兒子,能夠經過下標取值(xpath語法是從1開始數) driver.find_element_by_xpath('//android.webkit.WebView[@content-desc="安全驗證"]/android.view.View[4]')
有多個相同標籤兒子,能夠經過下標取值(xpath語法是從1開始數)
七、兒子定位父親
# 兒子定位父親 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)
經過層級關係,一層一層的往下找,能夠經過爺爺元素,定位到孫子元素
# 爺爺定位孫子 # 爺爺元素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
聲明:本文爲博主學習感悟總結,水平有限,若是不當,歡迎指正。若是您認爲還不錯,歡迎轉載。轉載與引用請註明做者及出處。