1. 程式人生 > >selenium2.0

selenium2.0

一、概念
自動化測試,廣義上來講所有藉助工具來輔助進行軟體測試的方法都可以稱為自動化測試;狹義上來講,主要指基於UI層的功能自動化測試


分層自動化測試
1、單元自動化測試。幾乎所有的語言都有其相應的單元測試框架,如Java語言的Junit、python語言的unittest、Javascript的QUnit;code review為程式碼評審和程式碼審查,對原始碼進行系統性檢查,與code review相關的外掛,基於eclipse的reviewclipse、針對python的review board
2、介面自動化測試(介面測試的原理是通過測試程式模擬客戶端向伺服器傳送請求報文,伺服器接收請求報文後做處理響應給客戶端)
大體分為兩類:模組介面測試和web介面測試
模組介面測試:主要強調對一個類方法或函式的呼叫,對返回結果的驗證,所用到的測試工具與單元自動化測試相同
web介面測試:分為伺服器介面測試和外部介面測試
伺服器介面測試:測試瀏覽器與伺服器的介面。使用者的操作在前端頁面上,需要後端提供伺服器介面,前端通過呼叫這些介面來獲得需要的資料,通過HTTP協議實現前後端的資料傳遞,Loadrunner也能做介面測試
外部介面測試:指用的介面由第三方系統提供
介面測試也有相應的類庫或工具,如HTTP的有HttpUnit,Postman等
3、UI功能自動化測試
早期的自動化測試工具主要針對該層設計,目前主流的測試工具:UFT、Watir、Robot Framework、Selenium、Appium
手機功能測試非自動化:藉助抓包工具charles、fiddler以及ddms抓包,看介面返回資料以及模擬介面返回資料


UFT(Unified Functional Testing) 由HP公司開發,提供了強大易用的錄製回放功能,同時相容物件識別模式與影象識別模式兩種識別方式,支援B/S和C/S兩種架構
Robot Framework 基於python語言編寫的,可同時測試多種型別的客戶端或介面,可以進行分散式測試
Watir(web application testing in ruby) 基於Ruby開發的,用於web應用程式測試的工具
selenium 主要用於web應用程式的自動化測試,支援多平臺、多瀏覽器、多語言


selenium 不是由單獨一個工具構成的,而是由一些外掛、類庫組成
selenium2=selenium1.0+webDriver
webDriver是通過原生瀏覽器支援或者瀏覽器擴充套件來直接控制瀏覽器。webDriver可以看作是selenium RC的替代品
選擇selenium自動化測試語言時不需要考慮與開發語言的一致性


selenium IDE基於Firefox瀏覽器的一個外掛,提供了指令碼的錄製、回放以及編輯指令碼的功能


selenium Grid 可以在不同的主機上建立主節點hub和分支節點node,可以使主節點上的測試用例在不同的分支節點上執行。幫助我們進行分散式測試的工具
python多執行緒,分散式和並行是兩個完全不同的概念,分散式只負責將一個測試用例遠端呼叫到不同的環境下執行,而並行強調同時執行多個任務
python通過兩個標準庫thread和threading提供對執行緒的支援,threading支援守護執行緒


自動化測試模型介紹
線性測試,每個指令碼相對獨立且不產生其他依賴與呼叫,每個指令碼是一個測試用例
模組化驅動測試,把重複的操作獨立成公共模組,
資料驅動測試,資料引數化,實現資料與指令碼的分離。引數化方式:定義變數、定義陣列、字典、讀取檔案(txt/csv/xml)
關鍵字驅動測試,


二、安裝
步驟一,下載並安裝python
步驟二,下載並安裝pip
步驟三,下載並安裝selenium,md進入相應的目錄下—》python -m pip install --user selenium-3.4.3-py2.py3-none-any.whl
python所安裝的第三方類庫或框架模組預設存放在C:\Users\Administrator\AppData\Roaming\Python\Python36\site-packages目錄下
是否安裝成功:pip3 show selenium
步驟四,下載並安裝瀏覽器驅動,解壓縮得IEDriverServer.exe—》放在環境目錄下,可放於python的環境目錄下


遇到的問題:selenium.common.exceptions.WebDriverException:Message:Unexcpected error launching Internet Exceplorer.Protected Mode settings are not the same for all zones.Enable Protected Mode must be set to the same value for all zones.
修改瀏覽器安全設定—》將Internet/本地Internet/受信任的站點/受限制的站點所有的啟用保護模式全部都去掉勾


三、WebDriver API 定位元素
find_element_by_id(“”)  在當前頁面中唯一
find_element_by_name(“”)  在當前頁面中不唯一
find_element_by_class_name(“”) 可以被多次引用
find_element_by_tag_name(“input”) tag識別某個元素的概率很低
find_element_by_link_text(“hao123”) 通過元素標籤對之間的文字資訊來定位元素
find_element_by_partial_link_text(“”) 通過元素標籤對之間的部分文字資訊來定位元素


XPath定位
1.絕對路徑定位 find_element_by_xpath(“html/body/div/div[2]/div/div/div/form/span/input”)
div[2]表示當前層級下的第二個div標籤
2.利用元素屬性 find_element_by_xpath(“//input[@id=’kw’]”)
//表示當前頁面某個目錄下,input為標籤名,如果不想指定標籤名,可用星號(*)代替,不侷限於id,能唯一標識元素的任意屬性都可以
3.層級與屬性結合 find_element_by_xpath(“//span[@class=’bg’]/apan[2]/input”)
4.使用邏輯運算子 find_element_by_xpath(“//input[@id=’kw’ and class=’su’]/span/input”)


CSS定位
1.通過class屬性定位(.) find_element_by_css_selector(“.bg”)
2.通過id屬性定位(#) find_element_by_css_selector(“#kw“)
3.通過標籤名定位 find_element_by_css_selector(“input”)
4.通過父子關係定位 find_element_by_css_selector(“span>input”)
5.通過屬性定位  find_element_by_css_selector(“[name=’kw’]”)
6.組合定位 find_element_by_css_selector(“form.fm>span>input.s”)


用By定位元素,更推薦前面介紹的寫法
find_element(By.ID,”kw”)
find_element(By.NAME,”wd”)
find_element(By.CLASS_NAME,”s_ipt”)
find_element(By.TAG_NAME,”input”)
find_element(By.LINK_TEXT,”hao123”)
find_element(By.PARTIAL_LINK_TEXT,”hao”)
find_element(By.XPATH,”//*[@class=’bg’]”)
find_element(By.CSS_SELECTOR,”span.bg>input#su”)


360安全瀏覽器,F12開啟開發者選項,可以定位相關的元素,右擊有copy css path和copy xpath,非常方便


有時候,F12開發者選項框並不會嵌在頁面的右側,可以用左上方箭頭圖示定位頁面元素




四、WebDriver API 操作元素
driver.set_window_size(480,800)  控制瀏覽器視窗大小
driver.maximize_window() 開啟瀏覽器全屏
driver.back()  模擬瀏覽器後退
driver.forward() 模擬瀏覽器前進
driver.refresh() 重新整理當前頁面


clear 清除文字
send_keys(“”) 模擬按鍵輸入
click() 單擊元素
submit() 提交表單,submit()的應用範圍遠不及click()廣泛


size 返回元素的尺寸
text 返回元素的文字
get_attribut(name) 獲得屬性值
is_displayed() 設定該元素是否使用者可見


perform() 執行所有actionchains中儲存的行為,可理解為對整個操作的提交動作
context_click() 右擊
double_click() 雙擊
drag_and_drop(source,target) 拖動
move_to_element()  滑鼠懸停
例:
right_click=driver.find_element_by_id(“xx”)
ActionChains(driver).context_click(right_click).perform()


send_keys() 模擬鍵盤輸入,如空格鍵send_keys(Keys.SPACE),全選send_keys(Keys.CONTROL,’a’)
獲得驗證資訊
1.title 獲得當前頁面的標題
2.current_url 獲得當前頁面的URL
3.text


顯示等待
WebDriver(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:瀏覽器驅動
timeout:最長超時時間,秒為單位
poll_frequency:檢測的間隔時間,預設為0.5s
ignored_exceptions:超時後的異常資訊,預設丟擲NoSuchElementException異常
一般配合until()和until_not()方法一起使用
until(method,message=’’) 呼叫該方法提供的驅動程式作為一個引數,直到返回值為True
until_not(method,message=’’) 呼叫該方法提供的驅動程式作為一個引數,直到返回值為False
隱式等待
driver.implicitly_wait(10) 並不針對頁面上的某一元素進行等待。如果元素可以定位,則繼續執行;如果元素定位不到,將以輪詢的方式不斷地判斷元素是否被定位到
sleep(3) 休眠時間


定位一組元素,如checkbox
find_elements_by_id() 此處為elements
......


對於frame/iframe表單內嵌頁面上的元素無法直接定位,需要通過switch_to.frame(“id”)
switch_to.parent_frame() 跳到上級frame
switch_to.default_content() 跳回最外層的頁面
如果frame下再內嵌著frame需要一級一級到達


swith_to.window() 在頁面操作過程中點選連結會彈出新的視窗
current_window_handle 獲得當前視窗控制代碼
window_handle 返回所有視窗的控制代碼到當前會話


switch_to_alert() 定位到alert/confirm/prompt
text 返回alert/confirm/prompt 中的文字資訊
accept() 接受現有警告框
dismiss() 解散現在警告框
send_keys(“text”) 傳送文字至警告框


上傳檔案 send_keys()
AutoIt
下載檔案 webdriver.FirefoxProfile()
AutoIt


操作cookie,cookie資料是以字典的形式進行存放的???[{},{}]
get_cookies() 獲得所有cookie資訊
get_cookie(name) 返回字典的key為name的cookie資訊
add_cookie(cookie_dice) 新增cookie,必須有name和value值
delete_cookie() 刪除cookie資訊
delete_all_cookies() 刪除所有的cookie資訊


呼叫javaScript
driver.execute_script(js)


處理HTML5的視訊播放
視窗截圖並儲存 driver.get_screenshot_as_file(“d:\\pyse\img.jpg”) 
關閉視窗 driver.close()


驗證碼的處理
1.去掉驗證碼
2.設定萬能驗證碼
3.驗證碼識別技術,python-tesseract
4.記錄cookie 將使用者名稱和密碼寫入瀏覽器cookie中,再次訪問網站時,伺服器將直接讀取瀏覽器的cookie進行登入


WebDriver原理
WebDriver屬於selenium體系中設計出來操作瀏覽器的一套API
1.WebDriver啟動目標瀏覽器,並繫結到指定埠。啟動的瀏覽器例項將作為WebDriver的Remote Server
2.Client端通過CommandExcuter傳送HTTPRequest給Remote Server的偵聽埠(通訊協議the webdriver wire protocol)
3.Remote Server需要依賴原生的瀏覽器元件來轉化瀏覽器的native呼叫


五、Selenium IDE
學習selenium IDE的目的不是為了使用它來進行自動化測試,但對新手來講,可以幫助我們編寫自動化測試指令碼
1、下載安裝外掛
2、selenium IDE介面介紹
3、編輯指令碼
command命令名稱\Target定位的元素\Value輸入的值
編輯一行命令或註釋、插入命令、插入註解、移動操作、定位輔助
4、selenium IDE命令
open(url) 在瀏覽器中開啟url
click(elementLocator)  單擊連結、按鈕、複選和單選框
clickAndWait()  單擊後需要等待響應
type(inputLocator,value)  模擬鍵盤輸入,向指定的input中輸入值
select(dropDownLocator,optionSpecifier) 根據optionSpecifier選項選擇器來選擇一個下拉選單選項
goback() 模擬單擊瀏覽器的後退按鈕
selectWindow(windowId) 選擇一個彈出視窗
pause(millisenconds) 根據指定時間暫停selenium指令碼執行
fireEvent(elementLocatore,evenName) 模擬頁面元素事件被啟用的處理動作
close() 模擬單擊瀏覽器關閉按鈕
5、斷言和驗證
真正的測試用例一定是需要做斷言和驗證的,一定要有預期結果與實際結果進行比較的過程。
四種命令:assert(斷言)、verify(驗證)、waitFor(等待)、store(定義變數)
五種驗證手段:Title(獲取頁面的標題)、Value(獲得元素的值)、Text(獲得元素的文字資訊)、Table(獲得元素的標籤)、ElementPresent(獲得當前元素)


使用斷言,測試用例將會在斷言失敗後停止執行;使用驗證,當執行驗證命令失敗後不會終止測試。
waitfor用於在一定時間內等待某一元素顯示
store(expression,variableName) expression為變數值,variableName為變數名


六、單元測試
單元測試框架unittest
1、TestCase 一個測試用例,包括測試前準備環境的搭建(setUp)、實現測試過程的程式碼(run)、測試後環境的還原(tearDown),一個測試用例就是一個完整的測試單元
2、TestSuite 一個功能的驗證往往需要多個測試用例,把我個測試用例集合在一起執行,就產生了測試套件TestSuite,可以通過addTest載入TestCase到TestSuite中
3、Test Runner 通過TextTestRunner類提供的run()方法來執行test suite/test case。test runner可以使用圖形介面、文字介面或返回一個特殊的值等方法來表示測試執行的結果
4、Test Fixture 對一個測試用例環境的搭建和銷燬就是一個fixture,通過覆蓋setUp()和tearDown()方法實現。setUpModule/tearDownModule在整個模組的開始與結束時被執行;setUpClass/tearDownClass 在測試類的開始與結束時被執行;setUp/tearDown在測試用例開始與結束時被執行。
例子:
from calculator import Count
import unittest


class TestCount(unittest.TestCase):
    def setUp(self):
        print("test start")
    def test_add(self):
        j = Count(2,3)
        self.assertEqual(j.add(),5)
    def test_add2(self):
        j = Count(41,76)
        self.assertEqual(j.add(),117)
    def tearDown(self):
        print("test end")
    
if __name__=="__main__":
    #構造測試集
    suite = unittest.TestSuite()
    suite.addTest(TestCount("test_add"))
    suite.addTest(TestCount("test_add2"))
    
    #執行測試
    runner = unittest.TextTestRunner()
runner.run(suite)


assertEqual(first,second,msg=None),斷言第一個引數和第二個引數是否相等,如果不相等則測試失敗。msg為可選引數,用於定義測試失敗時列印的資訊
assertNotEqual()
assertTrue()
assertFalse()
assertIn()
assertNotIn()
......


TestLoader類負責根據各種標準載入測試用例,並將它們返回給測試套件。unittest提供了可以共享的defaultTestLoader類,可以使用其子類和方法建立例項。discover()方法找到指定目錄下所有測試模組,並可遞迴查到子目錄下的測試模組,只有匹配到檔名才能被載入
discover(start_dir,pattern=’test*.py’,top_level_dir=None)
start_dir 要測試的模組名或測試用例目錄
pattern 表未用例檔名的匹配原則
top_level_dir = None 測試模組的頂層目錄,如果沒有頂層目錄,預設為None


unittest框架預設根據ASCII碼的順序載入測試用例,數字與字母的順序為0-9,A-Z,a-z
unittest.skip(reason) 無條件地跳過裝飾的測試,說明跳過測試的原因
unittest.skipIf(condition,reason) 如果條件為真時,跳過裝飾的測測試
unittest.skipUnless(condition,reason) 當條件為真時,執行測試
unittest.expectedFailure() 不管執行結是否失敗,統一標記為失敗


1、通過selenium IDE錄製一個測試用例
2、Export Test Case As—》python2/unittest/WebDriver
3、生成web自動化測試用例,利用其組織測試用例、斷言預期結果以及批量執行測試用例等功能
4、生成測試報告,HTMLTestRunner類,需下載放到python安裝目錄下,import匯入即可使用


pageObject設計模式,分層
1、Page基礎類,在初始化方法__init__()中定義驅動、基本的URL和超時時間等
2、LoginPage類,繼承Page類,對登入頁面的元素進行封裝,頁面物件層只關心元素的定位問題
3、test_user_login()函式,將單個元素操作組成一個完整的動作,重用性強
4、建立main()函式,測試用例只關心測試的資料