Selenium Webdriver之Chrome瀏覽器操作小記
Selenium
Selenium 是一套跨平臺的瀏覽器自動化測試框架(工具),支援在多種系統環境、多種瀏覽器環境下使用,還可以使用多種程式語言來編寫測試。
Selenium
有多個專案構成,形成了一個多功能的測試系統:
- Selenium Core:支援DHTML 的測試案例(效果類似資料驅動測試),它是Selenium IDE 和Selenium RC
的引擎。 - Selenium Grid - 允許您在不同的計算機上並行執行不同瀏覽器的測試。也就是說,針對執行不同瀏覽器和作業系統的不同計算機同時執行多個測試。從本質上講,Selenium-Grid支援分散式測試執行。它允許在分散式測試執行
- Selenium IDE - 用於開發Selenium測試用例的工具。它是一個易於使用的Chrome和Firefox擴充套件,通常是開發測試用例的最有效方式。它使用現有的Selenium命令為您在瀏覽器中記錄使用者操作,並使用該元素的上下文定義引數。這不僅節省了時間,而且是學習Selenium指令碼語法的絕佳方式。
- Selenium RC (Selenium Remote Control) - 是一個客戶端/伺服器系統,允許您使用幾乎任何程式語言和測試框架在本地或其他計算機上控制Web瀏覽器。
- Selenium WebDriver - 主要新功能是整合WebDriver API。除了解決Selenium-RC API中的一些限制之外,WebDriver還旨在提供更簡單,更簡潔的程式設計介面。Selenium-WebDriver的開發是為了更好地支援動態網頁,頁面元素可能會在不重新載入頁面的情況下發生變化。WebDriver的目標是提供精心設計的面向物件的API,為現代高階Web應用程式測試問題提供改進的支援。
**注意:**如出現Selenium官網訪問緩慢,可以在 C:\Windows\System32\drivers\etc\hosts
檔案內新增如下內容後嘗試
172.217.31.243 www.seleniumhq.org
Selenium 1.0
Selenium 1.0(又名,Selenium RC 或 Selenium Remote Control) 釋出於2004年,基本構成如下:
主要的兩個元件為:
- Selenium RC Server - 解釋並執行從測試程式傳遞的
Selenese
命令(Selenese 是 Selenium命令集合),並充當HTTP代理 - Client libraries - 提供每種程式語言和Selenium RC Server之間的介面。
簡化的架構圖如下:
Selenium 2.0
Selenium 2 = WebDriver + Selenium 1
Selenium 2.0釋出於2011年,是Selenium 1.0與Selenium WebDriver合併而成的一款效能更佳的產品。
WebDriver是一種用於自動化Web應用程式測試的工具,尤其是用於驗證它們是否按預期工作。它旨在提供一個易於探索和理解的友好API,比Selenium-RC(1.0)API更易於使用,這將有助於使您的測試更易於閱讀和維護。它不依賴於任何特定的測試框架,因此它可以在單元測試專案中使用。
Selenium 2.0 具有來自 WebDriver 的清晰面向物件 API,並能以最佳的方式與瀏覽器進行互動,更多Selenium WebDriver的API介面操作可以檢視此處。該版本中主推WebDriver,可以將其看做 Selenium RC 的替代。因為要保持向下相容,Selenium 2.0 中並沒有徹底放棄 Selenium RC。
Selenium 3.0
Selenium 3.0首次釋出於 2016年5月,主要有如下更新:
- 停止使用 Selenium core (放棄Selenium RC)
- 需要更高的Java版本支援(Java 8+)
- 不再預設支援Firefox驅動程式(Mozilla推出Gecko Driver)
- 使用W3C新標準的WebDriver
- 瀏覽器供應商自己的WebDriver實現
三個版本關係大致如下:
Selenium與瀏覽器driver
為了實現Selenium對瀏覽器的操作,針對幾款主流的瀏覽器,提供了對應的 driver
瀏覽器driver | 地址 |
---|---|
Chrome - ChromeDriver | github 下載地址1 下載地址2 |
Firefox - GeckoDriver | github 下載地址 |
Edge - Microsoft WebDriver | github 下載地址 |
Safari - WebDriver | source |
其他瀏覽器Driver |
此處下載 |
Selenium webdriver 模擬 Chrome 瀏覽器操作
對於 Selenium 的這裡僅作簡略介紹,大家可以參看官方文件或類似書籍來學習。下面通過一些小示例,簡單記錄在 Windows 10
、Python 2.7.15
、Selenium 3.14.1
、Chrome 71.0.3578.80
環境下,Selenium webdriver API 驅動 Chrome 瀏覽器操作的過程。
Chrome瀏覽器及chromedriver版本對應
要 Selenium
可以操作對應版本的瀏覽器,就要下載對應的 Driver
,下面為 ChromeDriver
對應的 Chrome
版本
chromedriver版本 | 支援的Chrome版本 |
---|---|
v2.44 | v69-71 |
v2.43 | v69-71 |
v2.42 | v68-70 |
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
v2.25 | v53-55 |
**注意:**Chrome 70+ 版本後出現對應小版本的chromedriver,如本文瀏覽器版本為
71.0.3578.80
,則下載對應該版本的chromedriver。更多版本檢視此處。
Python安裝Selenium
Selenium Python bindings 是Selenium WebDriver的Python繫結版本,用於Python的自動化瀏覽器互動操作。
支援 Python 2.7
及 Python 3.4+
版本。
Python安裝Selenium可以通過如下命令
pip install selenium
或
easy_install selenium
如果使用 Anaconda
或 Miniconda
,則使用如下命令安裝
conda install seleium
chromedriver 下載及配置
下載對應當前 Chrome
瀏覽器版本的 chromedriver
,在任意目錄解壓後,將解壓後的路徑配置到環境變數中方便程式中直接引用。
**注意:**64位瀏覽器下載32位driver即可。
注意: 操作不同瀏覽器,需要下載對應瀏覽器版本的driver,並新增driver路徑到環境變數中,否則執行程式碼時,會出現類似
selenium.common.exceptions.WebDriverException: Message: 'xxxdriver' executable needs to be in PATH.
的異常提示
Selenium webdriver例項化及頁面訪問
以下演示 Selenium
操控 Chrome
瀏覽器,開啟百度頁面
from selenium import webdriver
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 設定了chromedriver的環境變數,則此行程式碼等效於上面兩行程式碼
driver.get("https://www.baidu.com")
driver.maximize_window() # 好像沒有效果。。。
driver.quit()
get
方法會在頁面 onload
完成後顯示頁面,並繼續執行後續程式碼,如頁面記憶體在大量Ajax請求時,為了保證頁面完整載入,可以考慮使用waits來等待頁面載入完成。
Selenium webdriver API 獲取頁面元素
要定位一個元素,Selenium提供了下列的查詢元素的方法:
- find_element_by_id - 查詢對應id的元素
- find_element_by_name - 查詢對應名稱的元素
- find_element_by_xpath - 查詢對應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 - 查詢對應css選擇器的元素
如果要獲取多個相同元素(返回list列表),
- 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
除了上述的公共方法,還提供了兩個私有方法
配合 By
類也可以用來實現上面方法的功能,By
類提供了一組支援的定位策略屬性:
- CLASS_NAME = ‘class name’
- CSS_SELECTOR = ‘css selector’
- ID = ‘id’
- LINK_TEXT = ‘link text’
- NAME = ‘name’
- PARTIAL_LINK_TEXT = ‘partial link text’
- TAG_NAME = ‘tag name’
- XPATH = ‘xpath’
上述方法使用參看此處 (對應Selenium WebDriver API參看此處)
以下演示 selenium
查詢百度首頁按鈕元素,邊獲取元素值
from selenium import webdriver
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 設定了chromedriver的環境變數,則此行程式碼等效於上面兩行程式碼
driver.get("https://www.baidu.com")
# 查詢元素
search_btn = driver.find_element_by_id('su') #獲取百度首頁“百度一下”按鈕元素
print search_btn
print search_btn.id
print search_btn.size
print search_btn.tag_name
print search_btn.text
# 獲取元素屬性值
print search_btn.get_property('type')
print search_btn.get_attribute('class')
print search_btn.get_property('value')
# 獲取元素狀態
print search_btn.is_displayed()
print search_btn.is_enabled()
print search_btn.is_selected()
# 獲取元素css樣式
print search_btn.value_of_css_property('font')
print search_btn.value_of_css_property('color')
print search_btn.value_of_css_property('background')
driver.quit()
Selenium webdriver API 頁面表單操作
以下演示 Selenium
實現百度一下操作(用百度查詢 “selenium” 相關內容)
from selenium import webdriver
from selenium.webdriver.common.by import By
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 設定了chromedriver的環境變數,則此行程式碼等效於上面兩行程式碼
driver.get("https://www.baidu.com")
# 獲取百度首頁輸入框
search_input = driver.find_element(By.NAME, 'wd')
# 輸入框內填寫 “selenium”
search_input.send_keys("selenium")
# 獲取百度首頁“百度一下”按鈕
search_btn = driver.find_element(By.ID, 'su')
# 點選按鈕,實現表單提交
search_btn.click()
# driver.quit()
獲取輸入框元素後,使用 send_keys() 方法模擬輸入需要查詢的內容,之後獲取按鈕元素,並觸發 click() 方法模擬點選事件,以此模擬完成百度搜索功能