Python-元素定位API之XPATH
阿新 • • 發佈:2021-08-29
1、通過絕對路徑定位
絕對路徑的開頭是一個斜線(/),從網頁的根節點html開始,逐層去查詢需要的定位元素。
此方案缺點顯而易見,當頁面元素位置發生改變時,都需要修改,因此,並不推薦使用
舉例:百度搜索框絕對路徑定位
#絕對路徑 '/' 遇到同層級多個元素用下標表示,下標從1開始 自頂向下寫
# driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div[1]/div[1]/form/span/input').send_keys('部落格園')
備註:
當同一層有多個相同的元素時,使用下標區分,下標從1開始
2、通過相對路徑定位
相對路徑的開頭是兩個斜線(//),表示檔案中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來
舉例:百度搜索框相對路徑定位
#相對路徑 '//' 經驗 自低向上嘗試
# driver.find_element_by_xpath('//span[1]/input').send_keys('部落格園')
# driver.find_element_by_xpath('//form/span[1]/input').send_keys('部落格園')
備註:
以上都可以定位到百度搜索框,相對路徑的長度和開始位置並不受限制,可以採用從後往前逐層定位直到定位到即可的方式去定位
3、通過元素索引定位
遇到同層級相同標籤元素時,可以使用索引(下標)表示,索引的初始值為1
舉例:定位百度hao123連結
#通過元素索引定位,遇到同層級相同標籤元素時,可以使用索引(小標)表示,索引初始值為1
# driver.find_element_by_xpath('//div[1]/div[1]/div[5]/div[1]/div[1]/form/span/input').send_keys('部落格園')
4、使用元素屬性定位
元素屬性定位要求屬效能夠定位到唯一一個元素,如果存在多個相同條件的標籤,預設定位第一個,具體格式 //標籤名[@屬性=“屬性值”]
支援使用and 和 or關鍵字,多個屬性一起定位元素
舉例:
#屬性定位 //標籤名[@屬性=“屬性值”]
# driver.find_element_by_xpath('//input[@id="kw"]').send_keys('部落格園')
# driver.find_element_by_xpath('//input[@maxlength="255"]').send_keys('部落格園')
#多屬性定位 and or
# driver.find_element_by_xpath('//input[@id="kw" and @maxlength="255"]').send_keys('部落格園')
# driver.find_element_by_xpath('//input[@is="kw" or @maxlength="255"]').send_keys('部落格園')
備註:
Xpath支援萬用字元*號,通過屬性定位還可以如下寫法:
#支援萬用字元 *
# driver.find_element_by_xpath('//*[@*="kw"]').send_keys('部落格園')
5、使用部分屬性值匹配(也成為模糊方法定位)
屬性值如果太長或網頁中的元素屬性動態變化,可以使用此方法
元素屬性值開頭包含內容:starts-with()
#模糊定位、稱為部分屬性值定位
#starts-with() 字串以特定值開頭 下方a表示標籤名
# driver.find_element_by_xpath('//a[starts-with(@href,"http://news")]').click
#報錯原因ends-with() 是xpath語言2.0版本的函式 而當前xpath是xpath1.0版本的語言
#//a[ends-with(@href,"news.baidu.com")]' is not a valid XPath expression.
# driver.find_element_by_xpath('//a[ends-with(@href,"news.baidu.com")]').click()
元素屬性值結尾包含內容:substring()
#substring() 元素屬性值結尾包含內容 http://news.baidu.com
# driver.find_element_by_xpath('//a[substring(@href,8)="news.baidu.com"]').click()
元素屬性值結尾包含內容:contains()
#contains() 包含
# driver.find_element_by_xpath('//a[contains(@href,"news.baidu")]').click()
#應用 1、元素資訊過長 2、動態屬性元素 訂單 取第一個訂單點選 order_001 order_002 order_003
備註:
Xpath1.0沒有ends-with函式,2.0有,現在瀏覽器實現的都是1.0
6、使用元素文字定位
元素文字在xpath中可以通過text()函式獲取,也可以用其來進行元素定位。
#元素文字定位
#text()
# driver.find_element_by_xpath('//a[text()="新聞"]').click()
#元素模糊定位
# driver.find_element_by_xpath('//a[contains(text(),"新")]').click()