前言
在一般情況下类嗤,我們通過簡單的xpath即可定位到目標(biāo)元素,但對于一些既沒id又沒name糊肠,而且其他屬性都是動態(tài)的情況就很難通過簡單的方式進(jìn)行定位了。
在這種情況下遗锣,我們需要使用xpath1.0內(nèi)置的函數(shù)來進(jìn)行定位货裹,下面我們重點(diǎn)討論一下3個函數(shù):
- Contains
- Sibling
Contains函數(shù)
通過contains函數(shù),我們可以提取匹配特定文本的所有元素精偿。
例如在百度首頁弧圆,我們使用contains定位包含“新聞”文本的元素。
"http://div/a[contains(text(), 新聞)]"
在python selenium中使用xpath contains定位笔咽,代碼片段如下:
driver.find_element_by_xpath("http://div/a[contains(text(), 新聞)]")
sibling函數(shù)
通過sibling函數(shù)我們可以提取指定元素的所有同級元素搔预,即獲取目標(biāo)元素的所有兄弟節(jié)點(diǎn)。
例如通過剛才“新聞”節(jié)點(diǎn)來定位“hao123”節(jié)點(diǎn)拓轻。
"http://div/following-sibling::a[contains(text(), 新聞)]"
python selenium代碼片段為如下
driver.find_element_by_xpath(
u"http://div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞")
通過剛才“新聞”節(jié)點(diǎn)來定位其所有的兄弟節(jié)點(diǎn)。
python selenium代碼片段如下(注意這里用的是find_==elements==_by_xpath):
driver.find_elements_by_xpath(
u"http://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"http://div/a[contains(text(), '%s')]" % u"新聞")
print new_node.text
# 定位 “新聞”元素的兄弟節(jié)點(diǎn)“hao123”
hao123_node = driver.find_element_by_xpath(
u"http://div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞")
print hao123_node.text
# 定位 “新聞”元素的所有兄弟節(jié)點(diǎn)
all_node = driver.find_elements_by_xpath(
u"http://div/a[contains(text(), '%s')]/following-sibling::*" % u"新聞")
for ee in all_node:
print ee.text
driver.quit()
xpath常用函數(shù)
- child 選取當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)
- parent 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
- descendant 選取當(dāng)前節(jié)點(diǎn)的所有后代節(jié)點(diǎn)
- ancestor 選取當(dāng)前節(jié)點(diǎn)的所有先輩節(jié)點(diǎn)
- descendant-or-self 選取當(dāng)前節(jié)點(diǎn)的所有后代節(jié)點(diǎn)及當(dāng)前節(jié)點(diǎn)本身
- ancestor-or-self 選取當(dāng)前節(jié)點(diǎn)所有先輩節(jié)點(diǎn)及當(dāng)前節(jié)點(diǎn)本身
- preceding-sibling 選取當(dāng)前節(jié)點(diǎn)之前的所有同級節(jié)點(diǎn)
- following-sibling 選取當(dāng)前節(jié)點(diǎn)之后的所有同級節(jié)點(diǎn)
- preceding 選取當(dāng)前節(jié)點(diǎn)的開始標(biāo)簽之前的所有節(jié)點(diǎn)
- following 選去當(dāng)前節(jié)點(diǎn)的開始標(biāo)簽之后的所有節(jié)點(diǎn)
- self 選取當(dāng)前節(jié)點(diǎn)
- attribute 選取當(dāng)前節(jié)點(diǎn)的所有屬性
- namespace 選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn)
總結(jié)
在本文中對xpath常用的contains经伙、sibling函數(shù)進(jìn)行了說明和代碼演示扶叉,對于其他的函數(shù)建議大家自己寫代碼去實(shí)踐,理解其原理帕膜,將會更有利于后續(xù)的自動化測試實(shí)踐枣氧。