天天看點

Selenium自動化測試-Xpath定位詳解(七)

Xpath是什麼鬼?我們先來百度一下,然後就知道了xpath:XPath 是一門在 XML 文檔中查找資訊的語言,是 XSLT 中的主要元素。知道這麼多就可以了,那XML又是什麼?XML 指可擴充标記語言,用來存儲和傳輸資料滴。又因為頁面的html長的很像xml,是以呢,xpath也可以用來查找html文檔。下面來介紹下selenium常用到的xpath使用方法,還是以百度為例

Selenium自動化測試-Xpath定位詳解(七)

第一種,以元素的屬性查找,比如id,name,class等,可以看到屬性的表示文法格式為:[@屬性名稱=屬性值],但是有個要注意,元素的文本屬性的文法格式是:[text()=‘文本内容’]

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#查找元素屬性id=kw的元素
input_el = driver.find_element_by_xpath("//*[@id='kw']")
#查找元素屬性name=wd的元素
input_el = driver.find_element_by_xpath("//*[@name='wd']")
#查找元素屬性class=s_ipt的元素
input_el = driver.find_element_by_xpath("//*[@class='s_ipt']")
#查找元素屬性type=text的元素
input_el = driver.find_element_by_xpath("//*[@type='text']")
           

第二種,元素标簽名稱,搭配上元素的屬性

#查找元素标簽為input且屬性id=kw的元素
input_el = driver.find_element_by_xpath("//input[@id='kw']")
#查找元素标簽為input且name=wd的元素
input_el = driver.find_element_by_xpath("//input[@name='wd']")
#查查找元素标簽為input且class=s_ipt的元素
input_el = driver.find_element_by_xpath("//input[@class='s_ipt']")
#查找元素标簽為input且type=text的元素
input_el = driver.find_element_by_xpath("//input[@type='text']")
           

第三種,帶層級的查找方法,有時候單個元素屬性在文檔中有重複,或者定位不明顯,可以考慮先從它的長輩開始定位,就好比一個班上,有好幾個同學都叫小明,有時候老師點名,直接叫小明,那麼好多個小明都會站起來,那怎麼區分了?聰明的老師想到了一個辦法,點名的時候先說明同學的爸爸叫什麼名字,然後再說小明:小明且他的爸爸叫大明的同學,這樣大家都知道叫誰了,假如班裡恰好同學名字相同,且他爸爸的名字也相同的情況,那麼雜搞,還是一樣的,帶上他的爺爺,這樣總不會重複了吧;在xpath的層級定位中也是一樣的,格式如下:爺爺輩/父輩/本人,即用/來表示層級

#查找層級關系為form->span->元素标簽為input且屬性id=kw的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@id='kw']")
#查找層級關系為form->span->标簽為input且name=wd的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@name='wd']")
#查找層級關系為form->span->标簽為input且class=s_ipt的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@class='s_ipt']")
#查找層級關系為form->span->标簽為input且type=text的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@type='text']")
           

第四種,同級索引定位,對于相同層級中,元素的标簽,屬性都相同的,雜定位?就好比生活中的雙胞胎,長的一模一樣,名字也取的一樣(坑爹),那麼怎麼區分呢?先定位它們的爸爸,然後再說明是老大,還是老二(雙胞胎也是有先後的),xpath也是一樣的道理,對于同級的順序,我們用[索引]來表示,注意是從1開始,此處程式員表示蛋疼,數數不都是從0開始的嗎?

Selenium自動化測試-Xpath定位詳解(七)
#查找form标簽且id=form下的第三個input
input_el = driver.find_element_by_xpath("//form[@id=form]/input[3]")
           

第五種,邏輯運算定位,元素有多種屬性,可以用邏輯運算來表示,可以支援與(and)、或(or)、非(not)

#查找Input标簽且id=kw并且name=wd的元素
input_el = driver.find_element_by_xpath("//input[@id='kw' and @name='wd']")
           

第六種,模糊比對元素屬性

#查找元素屬性的id值包含k的元素
input_el = driver.find_element_by_xpath("//*[contains(@id,'k')]")
#查找元素屬性的id值以k開頭的元素
input_el = driver.find_element_by_xpath("//*[starts-with(@id,'k')]")
#查找a元素的text值包含聯考加油的元素
input_el = driver.find_element_by_xpath("//a[contains(text(),'聯考加油')]")
           

學了這麼多的方法,還是比較懵逼,為啥文法格式是這樣的呢,其實隻要會用就行了,但是如果要想更深入的了解這些文法,還有很多的知識點要了解,請參考:菜鳥教程-xpath