在Selenium Webdriver中使用XPath Contains、Sibling函數定位


前言

在一般情況下,我們通過簡單的xpath即可定位到目標元素,但對於一些既沒id又沒name,而且其他屬性都是動態的情況就很難通過簡單的方式進行定位了。

在這種情況下,我們需要使用xpath1.0內置的函數來進行定位,下面我們重點討論一下3個函數:

  • Contains
  • Sibling

Contains函數

通過contains函數,我們可以提取匹配特定文本的所有元素。

例如在百度首頁,我們使用contains定位包含“新聞”文本的元素。


baidu_news.png
"//div/a[contains(text(), 新聞)]"

在python selenium中使用xpath contains定位,代碼片段如下:

driver.find_element_by_xpath("//div/a[contains(text(), 新聞)]")

sibling函數

通過sibling函數我們可以提取指定元素的所有同級元素,即獲取目標元素的所有兄弟節點。

例如通過剛才“新聞”節點來定位“hao123”節點。

"//div/following-sibling::a[contains(text(), 新聞)]"

python selenium代碼片段為如下

driver.find_element_by_xpath(
u"//div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞")

通過剛才“新聞”節點來定位其所有的兄弟節點。

python selenium代碼片段如下(注意這里用的是find_==elements==_by_xpath):

driver.find_elements_by_xpath(
u"//div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞")

下面我們看一個完整的代碼示例:

#_*_ coding:utf-8 _*_ __author__ = '苦葉子' from selenium import webdriver import sys reload(sys) sys.setdefaultencoding("utf-8") if __name__ == '__main__': driver = webdriver.Ie() driver.get(u"http://www.baidu.com") # 定位 通過contains 定位包含“新聞”的元素 new_node = driver.find_element_by_xpath( u"//div/a[contains(text(), '%s')]" % u"新聞") print new_node.text # 定位 “新聞”元素的兄弟節點“hao123” hao123_node = driver.find_element_by_xpath( u"//div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞") print hao123_node.text # 定位 “新聞”元素的所有兄弟節點 all_node = driver.find_elements_by_xpath( u"//div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞") for ee in all_node: print ee.text driver.quit()

xpath常用函數

  1. child 選取當前節點的所有子節點
  2. parent 選取當前節點的父節點
  3. descendant 選取當前節點的所有后代節點
  4. ancestor 選取當前節點的所有先輩節點
  5. descendant-or-self 選取當前節點的所有后代節點及當前節點本身
  6. ancestor-or-self 選取當前節點所有先輩節點及當前節點本身
  7. preceding-sibling 選取當前節點之前的所有同級節點
  8. following-sibling 選取當前節點之后的所有同級節點
  9. preceding 選取當前節點的開始標簽之前的所有節點
  10. following 選去當前節點的開始標簽之后的所有節點
  11. self 選取當前節點
  12. attribute 選取當前節點的所有屬性
  13. namespace 選取當前節點的所有命名空間節點

總結

在本文中對xpath常用的contains、sibling函數進行了說明和代碼演示,對於其他的函數建議大家自己寫代碼去實踐,理解其原理,將會更有利於后續的自動化測試實踐。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM