??? 交流討論:歡迎加入我們一起學(xué)習(xí)!
?? 資源分享:耗時200+小時精選的「軟件測試」資料包
???教程推薦:火遍全網(wǎng)的《軟件測試》教程??
??歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正!
1、介紹
自動化測試概念:讓程序代替人為去驗(yàn)證程序功能的過程,本質(zhì)上就是用來讓將人的精力從重復(fù)性的工作中解放出來
優(yōu)點(diǎn):
- 減少人工的重復(fù)性勞動
- 執(zhí)行速度快
- 可以重復(fù)利用
- 生成測試報告,有利于決策
缺點(diǎn):
- 對測試人員的技能要求高
應(yīng)用場景:
- 單元測試
- 回歸測試:項目在發(fā)新版本之后對項目之前的功能進(jìn)行驗(yàn)證
- 壓力測試:可以理解多用戶同時去操作軟件,統(tǒng)計軟件服務(wù)器處理多用戶請求的能力
- 兼容性測試:不同瀏覽器(IE、Firefox、Chrome)等等
主流測試工具:
- QTP(收費(fèi)):?QTP是商業(yè)的功能測試工具,收費(fèi),支持web,桌面自動化測試。
- Selenium(開源)【本階段學(xué)習(xí)】:?Selenium是開源的web自動測試工具,免費(fèi),主要做功能測試。
- Jmeter(開源、Web、接口、性能, 接口測試使用):?Jmeter是由Apache公司使用Java平臺開發(fā)的一款測試工具,支持(Web、接口測試、性能測試)。
- Loadrunner(收費(fèi)、Web、性能):?Loadrunner是商業(yè)性能測試工具,收費(fèi),功能強(qiáng)大,適合做復(fù)雜場景的性能測試
- Robot framework:?Robot Framework是一個基于Python可擴(kuò)展地(關(guān)鍵字驅(qū)動)的測試自動化框架;
2、Web自動化:Selenium
2.1、Selenium介紹
- Selenium是一個用于Web應(yīng)用程序測試的工具,可以直接調(diào)用瀏覽器,它支持所有主流的瀏覽器。
-
最初是為網(wǎng)站自動化測試而開發(fā)的,但卻被很多爬蟲愛好者發(fā)揚(yáng)光大
-
官網(wǎng):https://www.selenium.dev/
特點(diǎn):
- 開源軟件:源代碼開放可以根據(jù)需要來增加工具的某些功能
- 跨平臺:linux 、windows 、mac
- 核心功能:就是可以在多個瀏覽器上進(jìn)行自動化測試
- 多語言:Java、Python、C#、JavaScript、Ruby等
- 成熟穩(wěn)定:目前已經(jīng)被google , 百度, 騰訊等公司廣泛使用
- 功能強(qiáng)大:能夠?qū)崿F(xiàn)類似商業(yè)工具的大部分功能,因?yàn)殚_源性,可實(shí)現(xiàn)定制化功能
2.1.1、WebDriver
Webdriver 是一種用于控制瀏覽器的程序,不同的瀏覽器有不同的 webdriver
- Chrome (ChromeDriver)【本階段學(xué)習(xí)使用】
- IE(InternetExplorerDriver)
- Opera(OperaDriver)
- Firefox (FirefoxDriver)
- safari(SafariDriver)
- HtmlUnit (HtmlUnit Driver)
webdriver 提供了對外的接口,其他程序通過這些接口控制 webdriver 與瀏覽器的交互。例如:我們可以寫 python 程序來調(diào)用 webdriver 的接口。實(shí)際上從其他程序的角度看,webdriver 就是充當(dāng)了和瀏覽器交互的一個橋梁。
說明:
- Firefox、Chrome:對元素定位和操作有良好的支持,同時對JavaScript支持也非常好。
- IE: 只能在windows平臺運(yùn)行,所有瀏覽器中運(yùn)行速度最慢
- HtmlUnit:無GUI(界面)運(yùn)行,運(yùn)行速度最快;
2.1.2、Selenium 執(zhí)行過程
python代碼--> selenium 封裝的 python 接口--> WebDriver 提供接口--> 瀏覽器
2.1.3、環(huán)境搭建
-
基于python環(huán)境搭建
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
注意:?在安裝selenium時,前提是Python3.5以上版本安裝完畢且能正常運(yùn)行
-
安裝適配瀏覽器版本的webdriver驅(qū)動
國內(nèi)不能直接訪問Chrome官網(wǎng),可以在ChromeDriver倉庫中下載或者h(yuǎn)ttps://npm.taobao.org/mirrors/chromedriver
2.2、元素定位
2.2.1、WebDriver元素定位的簡單方式
selenium頁面元素定位的方法,是在selenium中可以通過多種方式來定位標(biāo)簽,返回標(biāo)簽元素對象:
- 通過 id 屬性定位 :?
find_element_by_id
- 通過 name 屬性定位 :?
find_element_by_name
- 通過 class 屬性定位 :?
find_element_by_class_name
- 通過標(biāo)簽名定位 :?
find_element_by_tag_name
- 通過內(nèi)容定位 a 標(biāo)簽(絕對匹配) :?
find_element_by_link_text
- 通過內(nèi)容定位 a 標(biāo)簽(模糊匹配) :?
find_element_by_partial_link_text
Chrome(executable_path='./chromedriver')
中executable參數(shù)指定的是下載好的chromedriver文件的路徑- 要在代碼中盡量保證
driver.quit()
能夠成功執(zhí)行,進(jìn)而關(guān)閉driver退出模擬瀏覽器;不然將在操作系統(tǒng)中殘留進(jìn)程,對系統(tǒng)造成不必要的壓力
2.2.2、xpath方式
- XPath即為XML Path的簡稱,它是一種用來確定XML/HTML文檔中某部分位置的語言
- XPath文檔:XPath 教程
1、xpath路徑
html,xml 中的元素可以嵌套其他元素,但是根元素只有一個。我們可以這種嵌套關(guān)系看成路徑。路徑分絕對路徑和相對路徑:
- 絕對路徑:從根元素到指定元素之間所有經(jīng)過元素層級路徑,絕對路徑以 "/" 開始,例如: input 的絕對路徑是:?
/html/body/form/input
- 相對路徑:從任何元素開始到該元素的路徑,相對路徑以 "http://" 開始,例如: 用戶名輸入框標(biāo)簽的相對路徑有:?
//form/input
,//body/form/input
2、xpath定位
xpath 定位是結(jié)合路徑來進(jìn)行定位的,分為絕對定位和相對定位。定位過程中還可以結(jié)合元素的屬性值。
定位方法:find_element_by_xpath
-
純路徑定位
- 絕對定位:find_element_by_xpath("/html/body/form/input")
- 相對定位:find_element_by_xpath("http://div/ul/li/a")
-
結(jié)合屬性定位
- 單個屬性:find_element_by_xpath("http://input[@type='text']")
- 多個屬性:driver.find_element_by_xpath("http://input[@type='text' and @name='username']")
-
選擇上一級元素
- find_element_by_xpath("http://input/.."):返回的是 form 元素
-
滿足條件的多個元素,選擇其中的一個
- driver.find_element_by_xpath("http://ul/li[1]"):有多個 li 滿足條件,選擇其中一個,通過下標(biāo)來完成,下標(biāo)從 1 開始
- driver.find_element_by_xpath("http://ul/li[last()]"):選擇最后一個
- driver.find_element_by_xpath("http://ul/li[last()-1]"):選擇倒數(shù)第二個
2.2.3、CSS方式
定位方法:find_element_by_css_selector
- 在selenium中極力推薦CSS定位,因?yàn)樗萖Path定位速度要快
- CSS 選擇器語法非常強(qiáng)大,在這里我們只學(xué)習(xí)在測試中常用的幾個
2.2.4、查詢多個元素
- 通過 id 屬性定位 :?
find_elements_by_id
- 通過 name 屬性定位 :?
find_elements_by_name
- 通過 class 屬性定位 :?
find_elements_by_class_name
- 通過標(biāo)簽名定位 :?
find_elements_by_tag_name
- 通過內(nèi)容定位 a 標(biāo)簽(絕對匹配) :?
find_elements_by_link_text
- 通過內(nèi)容定位 a 標(biāo)簽(模糊匹配) :?
find_elements_by_partial_link_text
- 通過 xpath :?
find_elements_by_xpath
- 通過 CSS 選擇器:?
find_elements_by_css_selector
和選擇單個元素的字面區(qū)別就是多了個?s
。
區(qū)別:調(diào)用這類方法,會返回一個列表,沒有找到元素則返回空列表,查找單個元素的方法會在找不到元素時拋出?NoSuchElementException
?異常
2.3、元素等待
概念:WebDriver定位頁面元素時如果未找到,會在指定時間內(nèi)一直等待的過程。
元素等待的必要性:
當(dāng)使用腳本定位元素或去驗(yàn)證程序的運(yùn)行狀態(tài)時,由于資源受限或網(wǎng)絡(luò)延遲引起的響應(yīng)速度太慢,導(dǎo)致要定位的元素還未加載到頁面。
例如:頁面是通過 Ajax 發(fā)起請求,但是網(wǎng)絡(luò)有延遲,提交按鈕點(diǎn)擊完后,頁面等待服務(wù)器的返回結(jié)果來更新頁面,那么在這期間,測試代碼是不能夠直接去查找預(yù)期的元素的。
元素等待類型
- 顯式等待
- 隱式等待
2.3.1、顯式等待
概念:使 WebDriver 等待某個條件成立,否則在達(dá)到最大時長時拋出超時異常(TimeoutException)
1、WebDriverWait 類
from selenium.webdriver.support.wait import WebDriverWait
參數(shù):
- driver: webdriver對象
- timeout: 等待多長時間
- poll_frequency: 每次執(zhí)行失敗時休眠多長時間
2、調(diào)用方法
WebDriverWait.util(method, message=''):
參數(shù)說明:
- method 函數(shù),這個函數(shù)必須定義一個參數(shù),接受 driver 對象。例如:?
def contain_title(driver)
- message 如果等待失敗,message 作為消息拋出
返回值:如果找到,返回找到元素的對象
2.3.2、隱式等待
如果定位某一元素定位失敗,那么就會觸發(fā)隱式等待有效時長,如果在指定時長內(nèi)加載完畢,則繼續(xù)執(zhí)行,否則拋出 NoSuchElementException 異常。
調(diào)用方法
driver.implicitly_wait(10)
2.4、瀏覽器常用屬性和方法
2.4.1、屬性
driver.name:當(dāng)前瀏覽器的名字
driver.title:當(dāng)前網(wǎng)頁的標(biāo)題
driver.current_url:當(dāng)前網(wǎng)頁的
url driver.page_source:當(dāng)前網(wǎng)頁的源碼
2.4.2、方法
2.4.3、窗口截圖
說明:自動化腳本是由程序去執(zhí)行的,因此有時候打印的錯誤信息并不是十分明確。如果在執(zhí)行出錯的時候?qū)Ξ?dāng)前窗口截圖保存,那么通過圖片就可以非常直觀地看到出錯的原因。
在WebDriver類庫中,提供了截圖方法,我們只需要調(diào)用:
driver.get_screenshot_as_file(文件路徑.png)
2.4.4、執(zhí)行 javascript 代碼
有時候我們需要在特定頁面中執(zhí)行 javascript 腳本,通過?driver.execute_script(js代碼)
2.4.5、cookie
driver.get_cookies():
獲取所有的 cookie
driver.get_cookie(name):
獲取指定的 cookie
driver.delete_cookie(name):
刪除指定的 cookie
driver.delete_all_cookies():
刪除所有的 cookie
driver.add_cookie(cookie_dict):
添加一個 cookie cookie_dict {"name":"xxx","value":"xxx"} 可選的 key 是 "path", "domain", "secure", "expiry"
2.5、元素常用屬性和方法
2.5.1、模擬鼠標(biāo)單擊
點(diǎn)擊元素,通過調(diào)用?click()
?方法
2.5.2、輸入框元素填充數(shù)據(jù)和清空
如果是輸入框元素,可以通過?send_keys(字符串)
?將該字符串填充到輸入框中,通過?clear()
?清空輸入框
2.5.3、獲取標(biāo)簽屬性
html 元素有一些屬性,這些屬性通過?get_attribute(屬性名)
?來獲取
2.5.4、行為鏈
WebDriver 中將元素的點(diǎn)擊和發(fā)送表單數(shù)抽象位行為鏈,行為鏈中可以包含一個以上的動過,常見行為如下:
- 鼠標(biāo)單擊
- 鼠標(biāo)右擊
- 鼠標(biāo)雙擊
- 鼠標(biāo)拖動
- 鼠標(biāo)指針移動
- 按鍵按下
- 按鍵松開
1、ActionChains的使用
from selenium.webdriver.common.action_chains import ActionChains
使用步驟:
- 實(shí)例化 ActionChains
- 通過方法添加要執(zhí)行的行為,可以添加多個,并且可以鏈?zhǔn)教砑?,這一步是保存要執(zhí)行的行為,并不會執(zhí)行。例如
- 調(diào)用 Actionchains 對象的 perform() 執(zhí)行上一步添加的行為
2、方法參考
- reset_actions(self) : 清空行為鏈
- click(self, on_element=None): 鼠標(biāo)點(diǎn)擊
- click_and_hold(self, on_element=None) : 鼠標(biāo)按下
- release(self, on_element=None) : 松開鼠標(biāo)
- context_click(self, on_element=None) : 鼠標(biāo)右擊
- double_click(self, on_element=None) : 鼠標(biāo)雙擊
- drag_and_drop(self, source, target) : 拖動元素,source 被拖動元素,target 表示被拖動到那個元素中
- drag_and_drop_by_offset(self, source, xoffset, yoffset) : 拖動元素,給定x,y 軸偏移
- key_down(self, value, element=None) : 按鍵按下
- key_up(self, value, element=None) : 按鍵松開
- move_by_offset(self, xoffset, yoffset) : 鼠標(biāo)箭頭移動,給定 x,y 軸偏移
- move_to_element(self, to_element) : 鼠標(biāo)移動到某個元素中心
- move_to_element_with_offset(self, to_element, xoffset, yoffset) : 鼠標(biāo)移動到元素內(nèi)的 x,y 軸位置
- send_keys(self, *keys_to_send): 發(fā)送多個按鍵,也可以是一個字符串
- send_keys_to_element(self, element, *keys_to_send) :
2.6、窗口、frame、警告框
2.6.1、frame
frame:HTML頁面中的一種框架,主要作用是在當(dāng)前頁面嵌套另一頁面頁面; (HTML語言中,<frame></iframe>標(biāo)簽為表單框架)
webdriver只能訪問一個頁面,默認(rèn)是外層頁面,如果要訪問嵌套的頁面,必須切換當(dāng)前到嵌套頁面中。
切換
driver.switch_to.frame(frame 元素)
driver.switch_to.default_content() 切換到外層頁面
2.6.2、多窗口
說明:在HTML頁面中,經(jīng)常有a標(biāo)簽也就是超鏈接,這些鏈接在被執(zhí)行時,有的會在新的窗口打開鏈接;
切換
說明:在WebDriver中封裝了獲取當(dāng)前窗口句柄方法和獲取所有窗口句柄的方法以及切換指定句柄窗口的方法;(句柄:英文handle,窗口的唯一識別碼)
driver.switch_to.window(窗口句柄)
2.6.3、警告框處理
說明:WebDriver中對處理警告框的操作,有專用的處理方法;
提示: HTML中常用的對話框有三種,處理的方法都一樣
- alert
- confirm
- prompt
1、調(diào)用方法
# 獲取當(dāng)前窗口的警告框
alert=driver.switch_to.alert
2、警告框處理方法
- accept : 接受對話框選項
- dismiss : 取消對話框選項
2.7、下拉框
說明:下拉框就是HTML中<select>
元素;
2.7.1、Select類
from selenium.webdriver.support.select import Select
說明:Select 類是 WebDriver 為解決 select 標(biāo)簽定位誕生的,此類定位的是 select 標(biāo)簽。
使用步驟:
- 找到 select 元素
- 實(shí)例化 Select 對象
2.7.2、常用屬性和方法
2.8、無界面模式
2.8.1、Selenium無界面模式
絕大多數(shù)服務(wù)器是沒有界面的,selenium控制谷歌瀏覽器也是存在無界面模式的,這一小節(jié)我們就來學(xué)習(xí)如何開啟無界面模式(又稱之為無頭模式)
開啟無界面模式的方法
-
實(shí)例化配置對象
options = webdriver.ChromeOptions()
-
配置對象添加開啟無界面模式的命令
options.add_argument("--headless")
-
配置對象添加禁用gpu的命令
options.add_argument("--disable-gpu")
-
實(shí)例化帶有配置對象的driver對象
driver = webdriver.Chrome('./chromedriver', options=options)
注意:macos中chrome瀏覽器59+版本,Linux中57+版本才能使用無界面模式!
2.9、綜合練習(xí)
使用selenium+unittest對美多v5.0項目(http://mp-meiduo-python.itheima.net)的登陸和登出功能進(jìn)行自動化測試,并生成測試報告
2.9.1、目錄結(jié)構(gòu)
2.9.2、測試用例
2.9.3、main.py
最后我邀請你進(jìn)入我們的【軟件測試學(xué)習(xí)交流群:785128166】, 大家可以一起探討交流軟件測試,共同學(xué)習(xí)軟件測試技術(shù)、面試等軟件測試方方面面,還會有免費(fèi)直播課,收獲更多測試技巧,我們一起進(jìn)階Python自動化測試/測試開發(fā),走向高薪之路
作為一個軟件測試的過來人,我想盡自己最大的努力,幫助每一個伙伴都能順利找到工作。所以我整理了下面這份資源,現(xiàn)在免費(fèi)分享給大家,有需要的小伙伴可以關(guān)注【公眾號:程序員二黑】自提!
文章來源:http://www.zghlxwxcb.cn/news/detail-840253.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-840253.html
到了這里,關(guān)于自動化測試之web自動化(Selenium)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!