在Selenium Webdriver中使用XPath Contains、Sibling函數(shù)定位

前言

在一般情況下,我們通過簡單的xpath即可定位到目標(biāo)元素,但對于一些既沒id又沒name,而且其他屬性都是動態(tài)的情況就很難通過簡單的方式進(jìn)行定位了。

在這種情況下,我們需要使用xpath1.0內(nèi)置的函數(shù)來進(jìn)行定位,下面我們重點(diǎn)討論一下3個(gè)函數(shù):

  • Contains
  • Sibling

Contains函數(shù)

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

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

baidu_news.png
"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"新聞")

下面我們看一個(gè)完整的代碼示例:

#_*_ 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ù)

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

總結(jié)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容