XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。通俗一點講就是通過元素的路徑來查找到這個元素的,相當於通過定位一個對象的坐標,來找到這個對象。
Selenium WebDriver支持使用XPath表達式來定位元素。當發現通過ID、name或class屬性值無法定位元素時,可以嘗試使用XPath的方式。通過XPath可以靈活的應用絕對或相對路徑來定位元素。
1. 通過絕對路徑定位
XPath表達式表示從html代碼的最外層逐層查找,最后定位到按鈕節點。如果這樣不好理解,可以舉個生活中的例子,比如你的戶口所在地是XX省XX市XX區XX號。這相對於不熟悉你的人來說,通過這個地方就可以查找到你。
仍以bing首頁為例。借助FireFox瀏覽器的前端工具Developer Tools工具。從最頂層->->… …->標簽,拼接對應元素的絕對路徑,如圖示。

find_element_by_xpath方法使用XPath來定位元素。XPath主要用標簽名的層級來定位元素的絕對路徑,其中最外層html,然后在body內一級一級往下查找想找的元素。如果某個層級由多個相同的標簽,就按前后順序確定是第幾個,例如input[1]表示當前層級的第1個input標簽。
借助FireFox瀏覽器的前端工具Developer Tools工具,可以拼接出輸入框與搜索按鈕兩個元素的絕對路徑。
搜索框:/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/input[1]
搜索按鈕:/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/div[1]/input
要操作Bing搜索頁。
通過XPath找到搜索框與搜索按鈕元素;
通過鍵盤輸入檢索的關鍵字;
用鼠標單擊搜索按鈕;
提交搜索請求。
Selenium的完整代碼如下:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")
driver.find_element_by_xpath("/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/input[1]").send_keys("bella") #搜素框
driver.find_element_by_xpath("/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/div[1]/input").click() #搜索按鈕
sleep(3)
driver.quit()
借助Chrome瀏覽器的開發者工具能夠快速的獲得對應元素Xpath的絕對路徑。
在Chrome瀏覽器中打開bing。在Chrome菜單中選擇 【更多工具】 >【 開發者工具】(通過F12可以調用)。
通過選擇器,選中某元素(如搜索框元素),右鍵單擊選擇copy,然后單擊copy full XPath。就將該元素Xpath(搜索框元素)的絕對路徑復制下來,然后直接粘貼到代碼中使用即可,(/html/body/table/tbody/tr/td/div/div[2]/div[3]/form/div/input[1])如圖所示。

注:
通過XPath定位元素過程中,不要一味迷信使用FireFox的開發者工具,記得Seleium也是支持Chrome瀏覽器的。要很好的借助FireFox瀏覽器與Chrome瀏覽器兩者的開發者工具,綜合應用兩款瀏覽器的前端開發者工具,來獲得某元素的XPath。
為了避免人工造成的錯誤,盡量不要自己拼寫絕對路徑,避免拼寫路徑錯誤的發生。
2. 通過元素屬性定位
XPath定位元素除了使用絕對路徑外,也可以使用元素的某個屬性值來定位。同樣以bing首頁為例。
XPath通過元素的某個屬性值來定位元素,就無需手動拼寫了,可以借助FireFox瀏覽器與Chrome瀏覽器兩者的開發者工具完成。
借助FireFox瀏覽器開發者工具獲得搜索框元素XPath的值。如圖所示,FireFox Developer Tools中選中搜素框元素,然后右鍵單擊該元素的代碼區域,【復制】->【XPath】,就得到該元素的某個屬性值的Xpath值(//*[@id="sb_form_q"]),如圖所示。

同理,獲得搜索按鈕元素某個屬性值的Xpath(//[@id="sb_form_go"])。這里//表示當前頁面某個目錄下,表示匹配所有標簽,[@id="sb_form_go"]與[@id="sb_form_q"]表示對應元素(搜索框元素與搜索按鈕元素)的id屬性值是"sb_form_go"與"sb_form_q"。
XPath通過元素的某個屬性定位元素的完整代碼如下:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")
#簡化的xpath路徑
driver.find_element_by_xpath("//*[@id='sb_form_q']").send_keys("bella")
driver.find_element_by_xpath("//*[@id='sb_form_go']").click()
sleep(3)
driver.quit()
通過Chrome瀏覽的開發者工具,獲得元素XPath的某個屬性如圖所示。

XPath通過元素的某個屬性定位不僅僅局限於ID,可以通過人知道屬性值實現,如name、class等。
搜素框元素的html代碼。
搜索按鈕元素的html代碼。
此時就需要手動書寫通過兩個元素的name、class屬性實現XPath定位。下面分別通過name與class屬性值來定位。
通過元素的name屬性定位元素的完整代碼如下:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")
# 利用元素屬性定位--name
driver.find_element_by_xpath("//input[@name='q']").send_keys("bella")
driver.find_element_by_xpath("//input[@name='go']").click()
sleep(3)
driver.quit()
這里//表示當前頁面某個目錄下,input表示匹配input標簽的元素,[@name='q']與[@name='go']表示對應元素(搜索框元素與搜索按鈕元素)的name屬性值是"q"與"go"。
通過元素的class屬性定位元素的完整代碼如下:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://cn.bing.com/")
# 利用元素屬性定位--class
driver.find_element_by_xpath("//input[@class='b_searchbox']").send_keys("bella")
driver.find_element_by_xpath("//input[@class='b_searchboxSubmit']").click()
sleep(3)
driver.quit()

如果你覺的文章讀的不過癮,可以查看詳細的視頻教程。
【2021】UI自動化測試:Selenium3自動化測試
https://ke.qq.com/course/3172187?tuin=9c43f38e
【測試全系列視頻課程】請點擊我哦.....
地址:https://ke.qq.com/course/2525707?tuin=9c43f38e
圖書京東、當當有售
京東:https://item.jd.com/12784287.html
當當:http://product.dangdang.com/29177828.html)!

