環境:
Python:3.6.1
selenium:3.4.3
Firefox:54.0.1
geckodriver:0.15.0
chrome:59.0.3
chromedriver:v3.1
自動化測試基礎
1、軟件測試分類
根據項目流程:單元測試(編碼)、集成測試(設計)、系統測試(需求)、驗收測試
根據代碼是否可見:白盒測試、黑盒測試、灰盒測試
功能測試:邏輯功能測試、界面測試、易用性測試、安裝測試、兼容性測試
性能測試:負載測試、壓力測試
手工測試:手工執行測試用例
自動化測試:性能自動化和功能自動化
冒煙測試:在對系統進行正式測試之前,先驗證主要功能是否實現,是否具備可測性
回歸測試:修改代碼之后確保沒有引入新的錯誤,或導致其他代碼產生錯誤
隨機測試:為了模擬用戶的操作,測試中輸入的數據都是隨機的,以便發現一些邊緣性的錯誤
探索性測試:強調主觀能動性,碰到問題時主動改變策略
安全測試:驗證產品是否符合安全需求定義和產品質量標準
2、什么項目適合自動化
1)項目需求變動不頻繁(回歸測試,每日構建后的測試驗證)
2)項目周期長
3)自動化測試腳本可復用
3、自動化測試分類和工具
1)分類:UI自動化、接口自動化、單元測試自動化
2)工具:
QTP:企業級自動化測試工具,支持B/S,C/S架構
robot framework:Python語言編寫,支持關鍵字驅動,分布式測試
Watir:基于web模式的功能自動化測試工具
selenium:支持多語言、多平臺、多瀏覽器
4、selenium工具
1)特點:多語言---Java、Python、PHP、ruby
? ? ? ? ? ? ? ? 多平臺---Windows、Linux、Mac
? ? ? ? ? ? ? ?多瀏覽器----Firefox、chrome、IE
? ? ? ? ? ? ? ? 開源、免費
? ? ? ? ? ? ? ? 簡單、靈活
2)selenium1.0
selenium IDE:實現瀏覽器操作的簡單錄制和回放,支持多種語言
selenium Grid:自動化測試輔助工具
? ? ? ? ? ? ? ? ? ? ? ? ? 并行執行
? ? ? ? ? ? ? ? ? ? ? ? ? 通過一個主機控制用例在不同環境、不同瀏覽器下執行
selenium RC:selenium的核心,支持多種編程語言編寫腳本,通過selenium服務器作為代理服務器去訪問應用,從而實現測試的目的。
selenium RC:client libraries---編寫測試腳本,控制selenium server的庫
? ? ? ? ? ? ? ? ? ? ? ? selenium server---控制瀏覽器行為
selenium server:selenium core---一堆js函數,嵌入到瀏覽器中,通過這些函數控制瀏覽器操 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?作
? ? ? ? ? ? ? ? ? ? ? ? ? ? launcher---啟動瀏覽器,并將selenium core加載到瀏覽器中,將selenium ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? server的http proxy設置為瀏覽器的代理服務器
3)selenium2.0
webdriver替代了selenium RC,為了向下兼容性,selenium RC仍然可以使用
selenium RC通過嵌入到瀏覽器中的js函數操作
webdriver針對各瀏覽器開發,通過原生瀏覽器支持或者瀏覽器擴展控制瀏覽器
簡單自動化測試腳本
Python webdriver API
1、瀏覽器操作
1)瀏覽器最大化
driver.maximize_window()
2)設置瀏覽器寬和高
driver.set_window_size(400,800)
3)控制瀏覽器前進、后退
driver.forward()
driver.back()
2、簡單對象的定位
find_element_by_id()----唯一
find_element_by_name()----唯一
find_element_by_linx_text()----操作對象是文字超鏈接
find_element_by_partial_link_text()----操作對象是文字超鏈接
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_xpath()
暫時可以通過firepath定位xpath路徑,以后再研究
find_element_by_css_selector()
這個真的不懂,firebug里面可以定位
3、操作測試對象
clear()---------------清除內容,如默認用戶名和密碼
click()---------------模擬鼠標點擊操作
send_keys()------向輸入框輸入
submit()------------提交表單
4、WebElement接口常用方法
size--------------------返回元素尺寸
text----------------------獲取元素文本信息
get_attribute(name)-------------獲取元素某個屬性值
is_displayde-----------------------該元素用戶是否可見
5、鼠標事件
ActionChains類操作鼠標事件
ActionChains的使用
from selenium.webdriver.common.actionchains import ActionChains
ActionChains的執行原理
調用ActionChains方法的時候,用戶行為不會立刻執行,而是將所有操作放在一個隊列中,當執行perform()方法時,按照放入隊列的順序先進先出執行
ActionChains方法的書寫格式
ActionChains(driver).context_click(操作對象).perform()
鼠標點擊
context_click()------------------鼠標右擊
double_click()------------------鼠標雙擊(應用場景:查看圖片,雙擊選定文字)
click()-----------------------------鼠標點擊
click_and_hold()---------------按住鼠標左鍵不懂
鼠標移動
move_to_element(目標元素)------------------------移動到某個元素
move_by_offset(xoffset,yoffset)--------------------移動到某個坐標
鼠標拖曳
drag_and_drop(source,target)------將元素從起點source移動到終點target
drag_and_drop_by_offset(source,xoffset,yoffset)-------按照坐標移動
6、鍵盤事件
Keys類操作鍵盤事件
Keys類的使用
from selenium.webdriver.common.keys import Keys
常用的組合鍵
send_keys(Keys.CONTROL,'a')----------------全選
send_keys(Keys.CONTROL,'c')----------------復制
send_keys(Keys.CONTROL,'v')----------------粘貼
send_keys(Keys.CONTROL,'x')----------------剪切
常用的非組合鍵
send_keys(Keys.ENTER)--------------------------------回車鍵
send_keys(Keys.BACK_SPACE)----------------------刪除鍵
send_keys(Keys.SPACE)--------------------------------空格鍵
send_keys(Keys.TAB)------------------------------------制表鍵
send_keys(Keys.ESCAPE)------------------------------回退鍵
send_keys(Keys.F5)---------------------------------------刷新鍵
7、獲得頁面URL和title
1)獲得當前頁面title,判斷頁面跳轉是否符合預期
title = driver.title
2)獲得當前URL,一般用來測試重定向
url = driver.current_url
8、設置等待時間
sleep():設置固定休眠時間。Python的time包提供sleep方法
implicitly_wait():webdriver提供的一個隱性等待的時間,在一個時間段內只能的等待,超時則拋出異常
WebDriverWait():webdriver提供的另一個方法,在設置時間內,默認每隔一段時間去檢測頁面元素是否存在,如果超出設置時間檢測不到則拋出異常。
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驅動程序(Ie, Firefox, Chrome 或遠程)
timeout - 最長超時時間,默認以秒為單位
poll_frequency - 休眠時間的間隔(步長)時間,默認為0.5 秒
ignored_exceptions - 超時后的異常信息,默認情況下拋NoSuchElementException 異常。
9、定位一組對象
find_elements返回的是一個list
定位一組對象,一般應用于下列場景:
? ? ? ? ? ?批量操作對象,比如將頁面上的CheckBox都選上
1)find_elements_by_tag_name()
2)find_element_by_css_selector()
10、定位frame中的對象
針對frame嵌套的情況,使用switch_to.frame(id/name/xpath)切換到被嵌套的frame中
11、多窗口處理
要想在多個窗口之間切換,首先要獲得每一個窗口的唯一標識符號(句柄)。通過獲得的句柄來區別分不同的窗口,從而對不同窗口上的元素進行操作
driver.current_window_handle----------------------獲得當前窗口的句柄
driver.window_handles--------------------------------獲得所有窗口的句柄
driver.switch_to_handle("句柄")---------------------切換回句柄所屬的窗口
driver.close()---------------------------------------------關閉當前窗口
driver.quit()-----------------------------------------------關閉所有窗口
12、下拉菜單處理
1)傳統下拉菜單
先定位到下拉菜單,再點擊選項
2)下拉菜單需點擊才能顯示選項
有兩次點擊動作,第一次點擊下拉菜單,第二次點擊選項
3)下拉菜單不需點擊,鼠標放上去就會顯示選項,則可以使用move_to_element()方法定位
4)針對下拉菜單標簽是select的
導入Select類:from selenium.webdriver.support.select import Select
使用方法:Select(driver.find_element_by_name("xxx")).select_by_index()
選擇列表:
select_by_index(index)---------------------------根據index屬性定位選項,index從0開始
select_by_value(value)---------------------------根據value屬性定位
select_by_visible_text(text)----------------------根據選項文本值來定位
first_selected_option()----------------------------選擇第一個選項
清除列表
deselect_by_index(index)---------------------------根據index屬性清除選定的選項,index從0開始
deselect_by_value(value)---------------------------根據value屬性
deselect_by_visible_text(text)----------------------根據選項文本值
deselect_all()--------------------------------------------清除所有選項
13、上傳文件
上傳過程一般是打開一個系統的window窗口,從窗口選擇文件添加,一般會卡在如何操作Window窗口。其實,沒那么復雜,只要定位上傳按鈕,通過send_keys()添加文件路徑就可以了。
上傳控件標簽為input
上傳控件標簽為非input
可以借助第三方工具:Autolt
14、下載文件
webdriver允許設置默認下載路徑,從而可以跳過下載彈窗提示
1)chrome下載
思路:實例化一個option對象
? ? ? ? ? ?設置配置,并加載到option中
? ? ? ? ? ?啟動瀏覽器,點擊下載鏈接
優勢:使用谷歌瀏覽器下載,不需要針對各種文件類型進行配置
2)Firefox下載
對于Firefox,需要我們設置其Profile:
browser.download.dir:指定下載路徑
browser.download.folderList:設置成2表示使用自定義下載路徑;設置成0表示下載到桌面;設置成1表示下載到默認路徑
browser.download.manager.showWhenStarting:在開始下載時是否顯示下載管理器
browser.helperApps.neverAsk.saveToDisk:對所給出文件類型不再彈出框進行詢問
Firefox需要針對每種文件類型進行設置,這里需要我們查詢對應文件的MIME類型,可以用以下鏈接進行查詢:MIME 參考手冊
15、調用js和控制瀏覽器滾動條
1)webdriver提供了execute_script(script,*args)方法調用js
2)控制瀏覽器滾動條
應用場景:判斷法律文件是否閱讀完,滾動條拉倒最下面,表示用戶已看完
? ? ? ? ? ? ? ? ? ?要操作的元素不在視覺范圍內,需要拖動滾動條
火狐瀏覽器
谷歌瀏覽器
16、處理cookie
driver.get_cookies()-------------------------------獲得所有cookie
driver.get_cookie(name)-------------------------獲得name屬性的cookie
driver.add_cookie(cookie_dic)-----------------添加cookie(cookie格式為字典,)
driver.delete_cookie(name)---------------------刪除特定cookie
driver.delete_all_cookies()----------------------刪除所有cookie
17、驗證碼問題
跳過驗證碼的方法:
1)去掉驗證碼
2)設置萬能碼
3)通過cookie跳過驗證碼登錄
18、webdriver原理
1)WebDriver 啟動目標瀏覽器,并綁定到指定端口。該啟動的瀏覽器實例,做為web driver 的remote server。
2)Client 端通過CommandExcuter 發送HTTPRequest 給remote server 的偵聽端口(通信協議: the?webriver wire protocol)
3)Remote server 需要依賴原生的瀏覽器組件(如:IEDriverServer.exe、chromedriver.exe),來轉化轉化瀏覽器的native 調用。
自動化測試模型
1、自動化測試模型介紹
1)模塊化與類庫
將腳本中重復可復用的部分拿出來寫成一個公共的模塊,需要的時候就調用它,可以大大提高測試人員編寫腳本的效率。如將登錄和退出模塊化
模塊化的優點:提高效率,不用編寫重復腳本
? ? ? ? ? ? ? ? ? ? ? ? ?需要修改代碼時,只需要修改模塊代碼,調用模塊的代碼不需要修改
2)數據驅動
數據驅動可理解成參數化,輸入數據的不同從而導致輸出結果的不同
將數據與腳本分離
3)關鍵字驅動
通過關鍵字的改變引起結果的改變
QTP、robot framework 等都是以關鍵字驅動為主的自動化工具
2、登錄模塊化
3、數據驅動(參數化)
參數化方式:讀取TXT文件和CSV文件、函數、字典?
1)讀取TXT文件
分別打開兩個文件,將用戶名和密碼賦值給變量,傳遞給輸入框
缺點:用戶名和密碼在不同的文件中,修改較麻煩
? ? ? ? ? ?文件中只能保存一個用戶名和密碼,不能循環讀取
2)登錄參數化(函數)
user_info.py
登錄模塊中,通過2個變量來接受函數返回的值(用戶名、密碼),?
3)登錄參數化(字典)
user_info.py
登錄模塊通過字典的鍵值對取值
4)表單參數化
通過WPS 或excel 創建表格,文件另存為選擇CSV 格式
csv.reader()用于讀取CSV 文件,user[0] 表示表格中第一行第一列的數據(用戶名),user[1]表示表格中第一行第二列的數據(郵箱),后面類推。通過CSV 讀取文件比較靈活,可以循環讀取每一條數據,從而又不局限每次所讀取數據的個數。
自動化測試用例設計
1、手工測試用例和自動化測試用例
手工測試用例
? 較好的異常處理能力,能通過人為的邏輯判斷校驗當前步驟的功能實現正確與否。
? 人工執行用例具有一定的步驟跳躍性。
? 人工測試步步跟蹤,能夠細致的定位問題。
? 主要用來發現功能缺陷
自動化測試用例
? 執行對象是腳本,任何一個判斷都需要編碼定義。
? 用例步驟之間關聯性強。
? 主要用來保證產品主體功能正確完整和讓測試人員從繁瑣重復的工作中解脫出來。
? 目前自動化測試階段定位在冒煙測試和回歸測試。
2、測試類型
1)測試靜態內容
用于驗證靜態性的、不變化的UI元素的存在性
如,頁面底部備案信息,以及頁面頂部的圖片
2)測試鏈接
如果頁面鏈接經常變化或文件不時被重定向,可以嘗試自動化測試
3)功能測試
功能測試通常是需要自動化測試的最復雜的測試類型,但也通常是最重要的。典型的測試是登錄,注冊網站賬戶,用戶帳戶操作,帳戶設置變化,復雜的數據檢索操作等等。功能測試通常對應著您的應用程序的描述應用特性或設計的使用場景。
4)測試動態元素
5)ajax測試
Ajax 是一種支持動態改變用戶界面元素的技術。頁面元素可以動態更改,但不需要瀏覽器重新載入頁面,如動畫,RSS 源,其他實時數據更新等等。
6)斷言assert和驗證verify
斷言的優點和缺點:
優點:你可以直截了當地看到檢查是否通過。
缺點:當檢查失敗,后續的檢查不會被執行,無法收集那些檢查的結果狀態
驗證的優點和缺點:
優點:遇到失敗時,測試不會終止
缺點:不能得到測試失敗的相關反饋
及時得到反饋會更合適,因此斷言通常比驗證更常使用。
3、Python異常斷言?
1)異常的拋出機制:
1> 如果在運行時發生異常,解釋器會查找相應的處理語句(稱為handler).
2> 要是在當前函數里沒有找到的話,它會將異常傳遞給上層的調用函數,看看那里能不能處理。
3> 如果在最外層(全局“main”)還是沒有找到的話,解釋器就會退出,同時打印出traceback 以便讓用戶找到錯誤產生的原因。
注意:雖然大多數錯誤會導致異常,但一個異常不一定代表錯誤,有時候它們只是一個警告,有時候它們可能是一個終止信號,比如退出循環等。
2)捕捉異常
try....except...
輸出報錯信息
try...finally...
finally語句必須要要執行,比如:文件關閉,把數據庫連接返回給連接池
如圖,按Ctrl+C中斷程序
finally中的語句仍然被執行
3)raise拋出異常
4、webdriver截圖
Webdriver 提供錯誤截圖函數get_screenshot_as_file(),可以幫助我們跟蹤bug,在腳本無法繼續執行時候, get_screenshot_as_file()函數將截取當前頁面的截圖保存到指定的位置
5、編寫自動化測試實例
編寫自動化測試用例的原則:
1、一個腳本是一個完整的場景,從用戶登陸操作到用戶退出系統關閉瀏覽器。
2、一個腳本腳本只驗證一個功能點,不要試圖用戶登陸系統后把所有的功能都進行驗證再退出系統
3、盡量只做功能中正向邏輯的驗證,不要考慮太多逆向邏輯的驗證,逆向邏輯的情況很多(例如手號輸錯有很多種情況),驗證一方面比較復雜,需要編寫大量的腳本,另一方面自動化腳本本身比較脆弱,很多非正常的邏輯的驗證能力不強。(我們盡量遵循用戶正常使用原則編寫腳本即可)
4、腳本之間不要產生關聯性,也就是說編寫的每一個腳本都是獨立的,不能依賴或影響其他腳本。
5、如果對數據進行了修改,需要對數據進行還原。
6、在整個腳本中只對驗證點進行驗證,不要對整個腳本每一步都做驗證。
unittest單元測試框架
1、引入單元測試框架
測試類:
setup()方法要在每個方法執行前執行一次
teardown()方法在每個方法執行后執行一次