使用Selenium對網頁元素進行定位的諸種方法
使用Selenium進行自動化操作,首先要做的就是通過webdriver的get()方法打開一個URL鏈接。
在打開鏈接,完成頁面載入之後,就可以通過Selenium提供的介面,在頁面上進行各種操作了,下面我們來了解一下如何在查找元素。
3.1 查找和定位網頁元素
在上一篇的示例中,我們就演示了如何通過find_element_by_id()方法,根據元素的id值來定位頁面元素。
除了根據元素的id值來查找元素外,Selenium還提供了很多查找元素的方法:
從上圖中可以看到,Selenium提供了近二十個find_element族的方法來供我們在頁面中查找元素,其中包括id、name、類名、css選擇器、鏈接文本、標籤名、xpath等。
定位單個匹配元素的方法有:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
定位多個匹配元素的方法有:
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
我們可以根據不同頁面的不同情況來查找定位到我們所需要的頁面元素。
3.2 通過id屬性進行定位
如果你知道元素的id屬性值,那麼可以使用find_element_by_id()方法來定位元素,其將返回id屬性值與該位置匹配的第一個元素。
百度首頁的搜索框結構如下圖:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_id(haha)print(ele)
ele返回的是一個對應的element元素:
如果沒有元素匹配傳入的id值,將會拋出一個NoSuchElementException異常:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_id(haha)print(ele)
運行代碼,因為沒有匹配的id值,所以拋出了異常:
3.3通過name屬性進行定位
如果你知道元素的name屬性值,那麼可以使用find_element_by_name()方法獲取第一個匹配name屬性值的元素:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_name(wd)print(ele)
ele返回匹配到的element元素:
C:Python35python.exe E:/pythonproject/selenium_env/code/2.py<selenium.webdriver.remote.webelement.WebElement (session="23d00cea9ce99d36ffcac96cfb3ca12c", element="0.7355927465563321-1")>
如果定位一個沒有的name屬性值,那麼也會拋出NoSuchElementException異常:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_name(zmister)print(ele)
3.4 通過Xpath進行元素定位
XPath是用於在XML文檔中查找節點的一種語言。由於HTML可以是XML(XHTML)的實現,因此我們可以利用這種強大的語言在網頁中進行元素的定位。XPath擴展並支持了通過id或name屬性定位的簡單方法,並提供了各種新的操作,例如在頁面上查找第三個複選框等。
使用Xpath的一個原因是,有時候頁面上我們需要定位的元素並沒有id屬性和name屬性,這時候就可以用Xpath以絕對路徑的方式進行元素定位,或者是通過id或name屬性值定位到父元素再取到子元素。
對於Xpath的知識,在此不做介紹,有需要的同學看看專門介紹Xpath的網站或教程,比如:
- W3schhool Xpath教程
在此我們簡單介紹一下如何快速地通過瀏覽器獲取到頁面元素的Xpath路徑。在瀏覽器中打開網頁調試控制台,在需要定位的元素上,單擊滑鼠右鍵,會出現一個選項欄,在「copy」中選擇「Copy XPath」即可:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_xpath(//*[@id="kw"])print(ele)
這樣,我們通過XPath路徑也能夠定位到百度首頁搜索框:
3.5 通過標籤名來定位元素
當我們想通過元素的標籤名稱來定位一個元素時,可以使用find_element_by_tag_name()這個方法,其將返回具有給定標籤名稱的第一個元素:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_tag_name(input)print(ele)
在這裡,我們直接通過input的元素標籤名來進行定位,因為百度首頁上第一個input為搜索框,所以我們也能夠定位到:
如果匹配不到,同樣會拋出NoSuchElementException異常。
3.6 通過class類名來定位元素
如果我們想通過元素的class屬性值來定位,那麼可以使用find_element_by_class_name()方法。其將返回匹配的第一個元素,如果沒有匹配的元素,同樣會拋出NoSuchElementException異常:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_class_name(s_btn)print(ele)
在這裡,我們通過class類名定位了百度首頁的搜索按鈕。
3.7 通過CSS選擇器進行定位元素
CSS選擇器是一種通過元素的CSS屬性值來定位元素的語法,我們可以使用find_element_by_css_selector()方法通過css選擇器定位元素:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_css_selector(input.s_btn)print(ele)
CSS選擇器的絕對語法我們可以通過瀏覽器調試控制台中的「Copy」獲取到:
3.8 通過鏈接標籤文字定位元素
除了上述的元素定位方式,我們還可以通過a標籤上的文字進行元素定位,使用的是find_element_by_link_text()方法。
在百度首頁的最頂部,是有一排鏈接的,如下圖:
如果我們需要定位到「地圖」那個鏈接元素上,就可以這樣操作:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_link_text(地圖)print(ele)
這樣就成功的地位到了元素:
同樣的,如果匹配不到,也會拋出NoSuchElementException異常:
# coding:utf-8 @author:州的先生 @site:zmister.com @微信公眾號:州的先生from selenium import webdriverdriver = webdriver.Chrome(executable_path=r"D:chromedriver_win32chromedriver.exe")driver.get(http://www.baidu.com)ele = driver.find_element_by_link_text(州的先生)print(ele)
匹配不到鏈接文字為「州的先生」的元素:
3.9總結
在本篇,我們介紹了在使用Selenium打開一個頁面之後,如何通過id屬性、name屬性、class屬性、Xpath路徑、CSS選擇器、標籤名等方式對元素進行查找和地位。成功定位頁面元素是對頁面進行複雜操作的一個重要前提,下一篇我們將會介紹在頁面中進行各種操作。
推薦閱讀:
※Pycharm—FileNotFoundError: [WinError 2] 系統找不到指定的文件?
※淺析基於Selenium和TestNG的自動化測試框架
※Web自動化 - 選擇操作元素 1
※面試時能用到的一些selenium知識點
※selenium自動化測試入門 下拉框元素定位