標籤:實踐 span text 新聞 提取 selenium 節點 data 寫代碼
前言
在一般情況下,我們通過簡單的xpath即可定位到目標元素,但對於一些既沒id又沒name,而且其他屬性都是動態情況就很難通過簡單的方式進行定位了。
在這種情況下,我們需要使用xpath1.0內建的函數來進行定位,下面我們重點討論一下3個函數:
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 webdriverimport sysreload(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常用函數
- child 選取當前節點的所有子節點
- parent 選取當前節點的父節點
- descendant 選取當前節點的所有後代節點
- ancestor 選取當前節點的所有先輩節點
- descendant-or-self 選取當前節點的所有後代節點及當前節點本身
- ancestor-or-self 選取當前節點所有先輩節點及當前節點本身
- preceding-sibling 選取當前節點之前的所有同級節點
- following-sibling 選取當前節點之後的所有同級節點
- preceding 選取當前節點的開始標籤之前的所有節點
- following 選去當前節點的開始標籤之後的所有節點
- self 選取當前節點
- attribute 選取當前節點的所有屬性
- namespace 選取當前節點的所有命名空間節點
總結
在本文中對xpath常用的contains、sibling函數進行了說明和代碼示範,對於其他的函數建議大家自己寫代碼去實踐,理解其原理,將會更有利於後續的自動化測試實踐。
在Selenium Webdriver中使用XPath Contains、Sibling函數定位