Selenium
Selenium 是一套跨平臺的瀏覽器自動化測試框架(工具)惫谤,支持在多種系統(tǒng)環(huán)境丑慎、多種瀏覽器環(huán)境下使用迟螺,還可以使用多種編程語言來編寫測試拔妥。
Selenium
有多個項目構(gòu)成赶掖,形成了一個多功能的測試系統(tǒng):
- Selenium Core:支持DHTML 的測試案例(效果類似數(shù)據(jù)驅(qū)動測試)感猛,它是Selenium IDE 和Selenium RC
的引擎。 - Selenium Grid - 允許您在不同的計算機上并行運行不同瀏覽器的測試奢赂。也就是說陪白,針對運行不同瀏覽器和操作系統(tǒng)的不同計算機同時運行多個測試。從本質(zhì)上講膳灶,Selenium-Grid支持分布式測試執(zhí)行咱士。它允許在分布式測試執(zhí)行環(huán)境中運行測試。
- Selenium IDE - 用于開發(fā)Selenium測試用例的工具轧钓。它是一個易于使用的Chrome和Firefox擴展序厉,通常是開發(fā)測試用例的最有效方式。它使用現(xiàn)有的Selenium命令為您在瀏覽器中記錄用戶操作毕箍,并使用該元素的上下文定義參數(shù)弛房。這不僅節(jié)省了時間,而且是學習Selenium腳本語法的絕佳方式而柑。
- Selenium RC (Selenium Remote Control) - 是一個客戶端/服務器系統(tǒng)文捶,允許您使用幾乎任何編程語言和測試框架在本地或其他計算機上控制Web瀏覽器。
- Selenium WebDriver - 主要新功能是集成WebDriver API媒咳。除了解決Selenium-RC API中的一些限制之外拄轻,WebDriver還旨在提供更簡單,更簡潔的編程接口伟葫。Selenium-WebDriver的開發(fā)是為了更好地支持動態(tài)網(wǎng)頁,頁面元素可能會在不重新加載頁面的情況下發(fā)生變化院促。WebDriver的目標是提供精心設計的面向?qū)ο蟮腁PI筏养,為現(xiàn)代高級Web應用程序測試問題提供改進的支持斧抱。
注意:如出現(xiàn)Selenium官網(wǎng)訪問緩慢,可以在 C:\Windows\System32\drivers\etc\hosts
文件內(nèi)添加如下內(nèi)容后嘗試
172.217.31.243 www.seleniumhq.org
Selenium 1.0
Selenium 1.0(又名渐溶,Selenium RC 或 Selenium Remote Control) 發(fā)布于2004年辉浦,基本構(gòu)成如下:
主要的兩個組件為:
-
Selenium RC Server - 解釋并運行從測試程序傳遞的
Selenese
命令(Selenese 是 Selenium命令集合),并充當HTTP代理茎辐,攔截和驗證在瀏覽器和AUT之間傳遞的HTTP消息宪郊。 - Client libraries - 提供每種編程語言和Selenium RC Server之間的接口。
簡化的架構(gòu)圖如下:
Selenium 2.0
Selenium 2 = WebDriver + Selenium 1
Selenium 2.0發(fā)布于2011年拖陆,是Selenium 1.0與Selenium WebDriver合并而成的一款性能更佳的產(chǎn)品弛槐。
WebDriver是一種用于自動化Web應用程序測試的工具,尤其是用于驗證它們是否按預期工作依啰。它旨在提供一個易于探索和理解的友好API乎串,比Selenium-RC(1.0)API更易于使用,這將有助于使您的測試更易于閱讀和維護速警。它不依賴于任何特定的測試框架叹誉,因此它可以在單元測試項目中使用。
Selenium 2.0 具有來自 WebDriver 的清晰面向?qū)ο?API长豁,并能以最佳的方式與瀏覽器進行交互,更多Selenium WebDriver的API接口操作可以查看此處忙灼。該版本中主推WebDriver匠襟,可以將其看做 Selenium RC 的替代。因為要保持向下兼容缀棍,Selenium 2.0 中并沒有徹底放棄 Selenium RC宅此。
Selenium 3.0
Selenium 3.0首次發(fā)布于 2016年5月,主要有如下更新:
- 停止使用 Selenium core (放棄Selenium RC)
- 需要更高的Java版本支持(Java 8+)
- 不再默認支持Firefox驅(qū)動程序(Mozilla推出Gecko Driver)
- 使用W3C新標準的WebDriver
- 瀏覽器供應商自己的WebDriver實現(xiàn)
三個版本關系大致如下:
Selenium與瀏覽器driver
為了實現(xiàn)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
環(huán)境下,Selenium webdriver API 驅(qū)動 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+ 版本后出現(xiàn)對應小版本的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
丢氢,在任意目錄解壓后,將解壓后的路徑配置到環(huán)境變量中方便程序中直接引用先改。
注意:64位瀏覽器下載32位driver即可疚察。
注意: 操作不同瀏覽器,需要下載對應瀏覽器版本的driver盏道,并添加driver路徑到環(huán)境變量中稍浆,否則運行代碼時,會出現(xiàn)類似
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的環(huán)境變量衅枫,則此行代碼等效于上面兩行代碼
driver.get("https://www.baidu.com")
driver.maximize_window() # 好像沒有效果。朗伶。弦撩。
driver.quit()
get
方法會在頁面 onload
完成后顯示頁面,并繼續(xù)執(zhí)行后續(xù)代碼论皆,如頁面內(nèi)存在大量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
類也可以用來實現(xiàn)上面方法的功能陪竿,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的環(huán)境變量屠橄,則此行代碼等效于上面兩行代碼
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')
# 獲取元素狀態(tài)
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
實現(xiàn)百度一下操作(用百度查找 “selenium” 相關內(nèi)容)
from selenium import webdriver
from selenium.webdriver.common.by import By
chromedriver = "D:\ProgramData\pkgs\chromedriver"
driver = webdriver.Chrome(chromedriver)
# driver = webdriver.Chrome() # 設置了chromedriver的環(huán)境變量侈百,則此行代碼等效于上面兩行代碼
driver.get("https://www.baidu.com")
# 獲取百度首頁輸入框
search_input = driver.find_element(By.NAME, 'wd')
# 輸入框內(nèi)填寫 “selenium”
search_input.send_keys("selenium")
# 獲取百度首頁“百度一下”按鈕
search_btn = driver.find_element(By.ID, 'su')
# 點擊按鈕诽俯,實現(xiàn)表單提交
search_btn.click()
# driver.quit()
獲取輸入框元素后,使用 send_keys() 方法模擬輸入需要查找的內(nèi)容妥凳,之后獲取按鈕元素胀葱,并觸發(fā) click() 方法模擬點擊事件盗扇,以此模擬完成百度搜索功能