php網(wǎng)站開發(fā)總結(jié)環(huán)球軍事新聞最新消息
一、什么是web自動(dòng)化測(cè)試
? ? ? ? ? ? 讓程序員代替人為去驗(yàn)證web項(xiàng)目功能的過程
二、什么web項(xiàng)目適合自動(dòng)化測(cè)試?
????1)需求變動(dòng)不頻繁
測(cè)試腳本的穩(wěn)定性決定了自動(dòng)化測(cè)試的維護(hù)成本。如果軟件需求變動(dòng)過于頻繁,測(cè)試人員需要根據(jù)變動(dòng)的需求來更新測(cè)試用例以及相關(guān)的測(cè)試腳本,而腳本的維護(hù)本身就是一個(gè)代碼開發(fā)的過程,需要修改、調(diào)試,必要的時(shí)候還要修改自動(dòng)化測(cè)試的框架,如果所花費(fèi)的成本不低于利用其節(jié)省的測(cè)試成本,那么自動(dòng)化測(cè)試便是失敗的。
項(xiàng)目中的某些模塊相對(duì)穩(wěn)定,而某些模塊需求變動(dòng)性很大。我們便可對(duì)相對(duì)穩(wěn)定的模塊進(jìn)行自動(dòng)化測(cè)試,而變動(dòng)較大的仍是用手工測(cè)試
??2) 項(xiàng)目周期足夠長
? ? ? ? 自動(dòng)化測(cè)試需求的確定、自動(dòng)化測(cè)試框架的設(shè)計(jì)、測(cè)試腳本的編寫與調(diào)試均需要相當(dāng)長的時(shí)間來完成,這樣的過程本身就是一個(gè)測(cè)試軟件的開發(fā)過程,需要較長的時(shí)間來完成。如果項(xiàng)目的周期比較短,沒有足夠的時(shí)間去支持這樣一個(gè)過程,那么自動(dòng)化測(cè)試便成為笑談。
3)自動(dòng)化測(cè)試腳本可重復(fù)使用(項(xiàng)目需要回歸測(cè)試)
??????? 如果費(fèi)盡心思開發(fā)了一套近乎完美的自動(dòng)化測(cè)試腳本,但是腳本的重復(fù)使用率很低,致使其間所耗費(fèi)的成本大于所創(chuàng)造的經(jīng)濟(jì)價(jià)值,自動(dòng)化測(cè)試便成為了測(cè)試人員的練手之作,而并非是真正可產(chǎn)生效益的測(cè)試手段了。
另外,在手工測(cè)試無法完成,需要投入大量時(shí)間與人力時(shí)也需要考慮引入自動(dòng)化測(cè)試。比如、性能測(cè)試、配置測(cè)試、大數(shù)據(jù)量輸入測(cè)試等。
三、web測(cè)試的主流測(cè)試工具
? ? ? ? ? ??web自動(dòng)化測(cè)試工具 seleuium(我現(xiàn)在用的是這個(gè))
???QTP(全名HP QuickTest Professional software)
?????????????Robot Framework自動(dòng)化測(cè)試框架
Selenium簡(jiǎn)介
? ? ? ? selenium是一款基于web應(yīng)用程序的開源測(cè)試工具
? ? selenium測(cè)試直接運(yùn)行在瀏覽器中,就想真正的用戶在操作一樣。
? ? ? ? 它支持Firefox(火狐)、ie、chrome(谷歌)等眾多瀏覽器
? ? ? ? 它同時(shí)支持java、c#、Ruby、Python、Php、Perl等眾多語言? ??
selenium簡(jiǎn)單的理解
? ??????Selenium就是將瀏覽器原聲的API封裝成Webdriver API,Webdriver是基于http協(xié)議的
Appium是基于Webdriver協(xié)議添加對(duì)移動(dòng)設(shè)備自動(dòng)化api擴(kuò)展而成的,基于tcp/ip協(xié)議
操作層面的理解
? ??1、測(cè)試人員編寫UI自動(dòng)化測(cè)試腳本(java、python等等),運(yùn)行腳本后,程序會(huì)打開指定的webdriver瀏覽器。
?2、webdriver瀏覽器座位一個(gè)remote-server接受腳本的命令,同時(shí)webservice會(huì)打開一個(gè)端口:http://localhost:46350 瀏覽器則會(huì)監(jiān)聽這個(gè)端口。
??? 3、webservice會(huì)將腳本語言翻譯成json格式傳遞給瀏覽器執(zhí)行操作命令。
邏輯層面的理解
??? 1、測(cè)試人員執(zhí)行測(cè)試腳本后,就創(chuàng)建了一個(gè)session,通過http請(qǐng)求想webservice發(fā)送了restfull的請(qǐng)求。
??? 2、webservice翻譯restfull的請(qǐng)求為瀏覽器能懂的腳本,然后接受腳本執(zhí)行結(jié)果。
??? 3、webservice將結(jié)果進(jìn)行封裝–json給到客戶端client測(cè)試腳本,然后client就知道操作是否成功,同樣測(cè)試也可以進(jìn)行校驗(yàn)了
selenium的主要功能
????????Selenium 是一款可以錄制用戶操作,幫助 Web 測(cè)試人員簡(jiǎn)化重復(fù)勞動(dòng)的工具。
在python中使用selenium必須下載selenium的插件
? ? 打開python里面的設(shè)置
Selenium Webdriver查找頁面元素及元素及元素操作
? ? 1.常用的元素定位方法
? 通過id定位元素:find_element_by_id("id_vaule")
??????? 通過name定位元素:find_element_by_name("name_vaule")
??????? 通過tag_name定位元素:find_element_by_tag_name("tag_name_vaule")
??????? 通過class_name定位元素:find_element_by_class_name("class_name")
??????? 通過css定位元素:find_element_by_css_selector();用css定位是比較靈活的
??????? 通過xpath定位元素:find_element_by_xpath("xpath")
??????? 通過link_text定位:driver.find_element_by_link_text("新聞").click()
?????? 通過partial link_text定位:driver.find_element_by_partial_link_text("聞").click()
2.定位元素分類總結(jié)(解釋)
? Id,name,class name:為元素屬性定位
??????? tag_name:為元素標(biāo)簽
??????? link text、partial link text:為超鏈接定位(a標(biāo)簽)
??????? Xpath:為元素路徑
??????? Css:為css元素選擇器定位
3.elements復(fù)數(shù)定位
? 上面的八中元素,都有對(duì)應(yīng)的復(fù)數(shù)形式
??????? find_elements_by_id("id_vaule")
??????? find_elements_by_name("name_vaule")
??????? find_elements_by_tag_name("tag_name_vaule")
??????? find_elements_by_class_name("class_name"
??????? find_elements_by_css_selector();
??????? find_elements_by_xpath("xpath")
??????? find_elements_by_link_text("新聞").click()
??????? find_elements_by_partial_link_text("聞").click()
??? 這些復(fù)數(shù)定位方式每次取到的都是具有相同類型屬性的一組元素,所以返回的是一個(gè)list隊(duì)列,我們也可以利用這個(gè)去定位單個(gè)的元素。比如百度首頁種,右上角有新聞、視頻、地圖、貼吧等一些鏈接
??? 舉個(gè)例子比如定位排在第六個(gè)的學(xué)術(shù),可以這樣定位:driver.find_elements_by_class_name("mnav")[5].click()
4.簡(jiǎn)單的元素操作
clear()清除文本
??????? send_keys(*value)模擬按鍵輸入
??????? click()單擊元素
??????? size返回元素的尺寸
??????? text獲取元素的文本
??????? get_attribute(name)獲取屬性值
??????? is_displayed()設(shè)置該元素是否可見 判斷元素是否可見 是否可用 is_enable() 了解
??????? 在使用 Selenium WebDriver 做自動(dòng)化測(cè)試的時(shí)候,會(huì)經(jīng)常模擬鼠標(biāo)和鍵盤的一些行為。比如使用鼠標(biāo)單擊、雙擊、右擊、拖拽等動(dòng)作;或者鍵盤輸入、快捷鍵使用、組合鍵使用等模擬鍵盤的操作。在 WebDeriver 中,有一個(gè)專門的類來負(fù)責(zé)實(shí)現(xiàn)這些測(cè)試場(chǎng)景,那就是 Actions 類,在使用該類的過程中會(huì)配合使用到 Keys 枚舉以及 Mouse、 Keyboard、CompositeAction 等類。
清單 1. 鼠標(biāo)左鍵點(diǎn)擊
??????????? Actions action = new Actions(driver);action.click();// 鼠標(biāo)左鍵在當(dāng)前停留的位置做單擊操作
??????????? action.click(driver.findElement(By.name(element)))// 鼠標(biāo)左鍵點(diǎn)擊指定的元素
清單 2. 鼠標(biāo)右鍵點(diǎn)擊
??????? Actions action = new Actions(driver);
??????? action.contextClick();// 鼠標(biāo)右鍵在當(dāng)前停留的位置做單擊操作
??????? action.contextClick(driver.findElement(By.name(element)))// 鼠標(biāo)右鍵點(diǎn)擊指定的元素
清單 3. 鼠標(biāo)雙擊操作
??????? Actions action = new Actions(driver);
??????? action.doubleClick();// 鼠標(biāo)在當(dāng)前停留的位置做雙擊操作
??????? action.doubleClick(driver.findElement(By.name(element)))// 鼠標(biāo)雙擊指定的元素
清單 4. 鼠標(biāo)拖拽動(dòng)作
??????? Actions action = new Actions(driver);
??????? // 鼠標(biāo)拖拽動(dòng)作,將 source 元素拖放到 target 元素的位置。
??????? action.dragAndDrop(source,target);
??????? // 鼠標(biāo)拖拽動(dòng)作,將 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 為橫坐標(biāo),yOffset 為縱坐標(biāo)。
??????? action.dragAndDrop(source,xOffset,yOffset);
??????? 在這個(gè)拖拽的過程中,已經(jīng)使用到了鼠標(biāo)的組合動(dòng)作,首先是鼠標(biāo)點(diǎn)擊并按住 (click-and-hold) source 元素,然后執(zhí)行鼠標(biāo)移動(dòng)動(dòng)作 (mouse move),移動(dòng)到 target 元素位置或者是 (xOffset, yOffset) 位置,再執(zhí)行鼠標(biāo)的釋放動(dòng)作 (mouse release)。所以上面的方法也可以拆分成以下的幾個(gè)執(zhí)行動(dòng)作來完成:
??????? action.clickAndHold(source).moveToElement(target).perform();
??????? action.release();
清單 5. 鼠標(biāo)懸停操作
??????? Actions action = new Actions(driver);
??????? action.clickAndHold();// 鼠標(biāo)懸停在當(dāng)前位置,既點(diǎn)擊并且不釋放
??????? action.clickAndHold(onElement);// 鼠標(biāo)懸停在 onElement 元素的位置
??????? action.clickAndHold(onElement) 這個(gè)方法實(shí)際上是執(zhí)行了兩個(gè)動(dòng)作,首先是鼠標(biāo)移動(dòng)到元素 onElement,然后再 clickAndHold, 所以這個(gè)方法也可以寫成 action.moveToElement(onElement).clickAndHold()。
清單 6. 鼠標(biāo)移動(dòng)操作
??????? Actions action = new Actions(driver);
??????? action.moveToElement(toElement);// 將鼠標(biāo)移到 toElement 元素中點(diǎn)
??????? // 將鼠標(biāo)移到元素 toElement 的 (xOffset, yOffset) 位置,
??????? //這里的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開始的 (x, y) 坐標(biāo)軸。
??????? action.moveToElement(toElement,xOffset,yOffset)
??????? // 以鼠標(biāo)當(dāng)前位置或者 (0,0) 為中心開始移動(dòng)到 (xOffset, yOffset) 坐標(biāo)軸
??????? action.moveByOffset(xOffset,yOffset);
??????? action.moveByOffset(xOffset,yOffset) 這里需要注意,如果 xOffset 為負(fù)數(shù),表示橫坐標(biāo)向左移動(dòng),yOffset 為負(fù)數(shù)表示縱坐標(biāo)向上移動(dòng)。而且如果這兩個(gè)值大于當(dāng)前屏幕的大小,鼠標(biāo)只能移到屏幕最邊界的位置同時(shí)拋出 MoveTargetOutOfBoundsExecption 的異常。
??????? 鼠標(biāo)移動(dòng)操作在測(cè)試環(huán)境中比較常用到的場(chǎng)景是需要獲取某元素的 flyover/tips,實(shí)際應(yīng)用中很多 flyover 只有當(dāng)鼠標(biāo)移動(dòng)到這個(gè)元素之后才出現(xiàn),所以這個(gè)時(shí)候通過執(zhí)行 moveToElement(toElement) 操作,就能達(dá)到預(yù)期的效果。但是根據(jù)我個(gè)人的經(jīng)驗(yàn),這個(gè)方法對(duì)于某些特定產(chǎn)品的圖標(biāo),圖像之類的 flyover/tips 也不起作用,雖然在手動(dòng)操作的時(shí)候移動(dòng)鼠標(biāo)到這些圖標(biāo)上面可以出現(xiàn) flyover, 但是當(dāng)使用 WebDriver 來模擬這一移動(dòng)操作時(shí),雖然方法成功執(zhí)行了,但是 flyover 卻出不來。所以在實(shí)際應(yīng)用中,還需要對(duì)具體的產(chǎn)品頁面做相應(yīng)的處理。
清單 7. 鼠標(biāo)釋放操
??????? Actions action = new Actions(driver);
??????? action.release();// 釋放鼠標(biāo)
????????? selenium的顯示等待
??????????????????? 原理:顯示等待,就是明確的要等到某個(gè)元素的出現(xiàn)或者是某個(gè)元素的可點(diǎn)擊等條件,等不到,就一直等,除非在規(guī)定的時(shí)間之內(nèi)都沒找到,那么久跳出Exception。
??????????????????? (簡(jiǎn)而言之,就是直到元素出現(xiàn)才去操作,如果超時(shí)則報(bào)異常)
???
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
??? driver:瀏覽器驅(qū)動(dòng)
??? timeout:最長超過時(shí)間,默認(rèn)以秒為單位
??? poll_frequency:監(jiān)測(cè)的時(shí)間間隔,默認(rèn)為0.5秒
??? ignored_exceptions:超時(shí)后的異常信息,默認(rèn)情況下拋NoSuchElementException異常
??? WebDriverWait一般有until和until_not方法配合使用
??? until(method,message)
??? until_not(method ,message)
?
?? selenium的隱式等待
??????????????? 原理:隱式等待,就是在創(chuàng)建driver時(shí),為瀏覽器對(duì)象創(chuàng)建一個(gè)等待時(shí)間,這個(gè)方法是得不到某個(gè)元素就等待一段時(shí)間,直到拿到某個(gè)元素位置。
??????????????? 注意:在使用隱式等待的時(shí)候,實(shí)際上瀏覽器會(huì)在你自己設(shè)定的時(shí)間內(nèi)部斷的刷新頁面去尋找我們需要的元素
?fromselenium importwebdriver
??????????? fromselenium.webdriver.common.by importBy
??????????? fromselenium.webdriver.support.ui importWebDriverWait
??????????? fromselenium.webdriver.support importexpected_conditions as EC
??????????? driver =webdriver.Chrome()
??????????? driver.implicity_wait(10)
??????????? driver.get('http://www.baidu')
?? implicity_wait()默認(rèn)參數(shù)的單位為妙,本例中設(shè)置等待時(shí)長為10秒,首先這10秒并非一個(gè)固定的等待時(shí)間,它并不影響腳本的執(zhí)行速度。其次,它并不針對(duì)頁面上的某一元素進(jìn)行等待。當(dāng)腳本執(zhí)行到某個(gè)元素定位是,如果元素可以定位,則繼續(xù)執(zhí)行,如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設(shè)在第六秒定位到了元素則繼續(xù)執(zhí)行,若直到超出設(shè)置的時(shí)長10秒還沒有定位到元素,則拋出異常。