一赏胚、什么是web自動化測試
? ? ? ? ? ? 讓程序員代替人為去驗證web項目功能的過程
二、什么web項目適合自動化測試?
? ??1)需求變動不頻繁
? ? ? ? ? 測試腳本的穩(wěn)定性決定了自動化測試的維護成本雄右。如果軟件需求變動過于頻繁,測試人員需要根據變動的需求來更新測試用例以及相關的測試腳本,而腳本的維護本身就是一個代碼開發(fā)的過程,需要修改婿着、調試,必要的時候還要修改自動化測試的框架幸海,如果所花費的成本不低于利用其節(jié)省的測試成本祟身,那么自動化測試便是失敗的奥务。
項目中的某些模塊相對穩(wěn)定物独,而某些模塊需求變動性很大。我們便可對相對穩(wěn)定的模塊進行自動化測試氯葬,而變動較大的仍是用手工測試
????2) 項目周期足夠長
? ? ? ? 自動化測試需求的確定挡篓、自動化測試框架的設計、測試腳本的編寫與調試均需要相當長的時間來完成帚称,這樣的過程本身就是一個測試軟件的開發(fā)過程官研,需要較長的時間來完成。如果項目的周期比較短闯睹,沒有足夠的時間去支持這樣一個過程戏羽,那么自動化測試便成為笑談。
? 3)自動化測試腳本可重復使用(項目需要回歸測試)
????????如果費盡心思開發(fā)了一套近乎完美的自動化測試腳本楼吃,但是腳本的重復使用率很低始花,致使其間所耗費的成本大于所創(chuàng)造的經濟價值妄讯,自動化測試便成為了測試人員的練手之作,而并非是真正可產生效益的測試手段了酷宵。
另外亥贸,在手工測試無法完成,需要投入大量時間與人力時也需要考慮引入自動化測試浇垦。比如性能測試炕置、配置測試、大數(shù)據量輸入測試等男韧。
三朴摊、web測試的主流測試工具
? ? ? ? ? ? web自動化測試工具 seleuium(我現(xiàn)在用的是這個)
????????????QTP(全名HP QuickTest Professional software)
?????????????Robot Framework自動化測試框架
Selenium簡介
? ? ? ? selenium是一款基于web應用程序的開源測試工具
? ? ? ? selenium測試直接運行在瀏覽器中,就想真正的用戶在操作一樣此虑。
? ? ? ? 它支持Firefox(火狐)仍劈、ie、chrome(谷歌)等眾多瀏覽器
? ? ? ? 它同時支持java寡壮、c#贩疙、Ruby、Python况既、Php这溅、Perl等眾多語言? ??
selenium簡單的理解
? ??????Selenium就是將瀏覽器原聲的API封裝成Webdriver API,Webdriver是基于http協(xié)議的
Appium是基于Webdriver協(xié)議添加對移動設備自動化api擴展而成的棒仍,基于tcp/ip協(xié)議
操作層面的理解
? ??1悲靴、測試人員編寫UI自動化測試腳本(java、python等等)莫其,運行腳本后癞尚,程序會打開指定的webdriver瀏覽器。
????2乱陡、webdriver瀏覽器座位一個remote-server接受腳本的命令浇揩,同時webservice會打開一個端口:http://localhost:46350 瀏覽器則會監(jiān)聽這個端口。
????3憨颠、webservice會將腳本語言翻譯成json格式傳遞給瀏覽器執(zhí)行操作命令胳徽。
邏輯層面的理解
? ??1、測試人員執(zhí)行測試腳本后爽彤,就創(chuàng)建了一個session养盗,通過http請求想webservice發(fā)送了restfull的請求。
????2适篙、webservice翻譯restfull的請求為瀏覽器能懂的腳本往核,然后接受腳本執(zhí)行結果。
????3嚷节、webservice將結果進行封裝–json給到客戶端client測試腳本聂儒,然后client就知道操作是否成功蝶缀,同樣測試也可以進行校驗了
selenium的主要功能
????????Selenium 是一款可以錄制用戶操作,幫助 Web 測試人員簡化重復勞動的工具薄货。
在python中使用selenium必須下載selenium的插件
? ? 打開python里面的設置
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.定位元素分類總結(解釋)
????????Id翁都,name,class name:為元素屬性定位
????????tag_name:為元素標簽
????????link text谅猾、partial link text:為超鏈接定位(a標簽)
????????Xpath:為元素路徑
????????Css:為css元素選擇器定位
3.elements復數(shù)定位
? ? ? ? 上面的八中元素柄慰,都有對應的復數(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()
? ??????這些復數(shù)定位方式每次取到的都是具有相同類型屬性的一組元素,所以返回的是一個list隊列税娜,我們也可以利用這個去定位單個的元素坐搔。比如百度首頁種,右上角有新聞敬矩、視頻概行、地圖、貼吧等一些鏈接
? ? 舉個例子比如定位排在第六個的學術弧岳,可以這樣定位:driver.find_elements_by_class_name("mnav")[5].click()
4.簡單的元素操作
? ??????clear()清除文本
????????send_keys(*value)模擬按鍵輸入
????????click()單擊元素
????????size返回元素的尺寸
????????text獲取元素的文本
????????get_attribute(name)獲取屬性值
????????is_displayed()設置該元素是否可見 判斷元素是否可見 是否可用 is_enable() 了解
鼠標事件和鍵盤事件 這里就簡單的說下鼠標的點擊事件(鍵盤事件看網址:)
? ??https://www.cnblogs.com/mashuqi/p/10442150.html
? ??????在使用 Selenium WebDriver 做自動化測試的時候凳忙,會經常模擬鼠標和鍵盤的一些行為。比如使用鼠標單擊禽炬、雙擊涧卵、右擊、拖拽等動作腹尖;或者鍵盤輸入柳恐、快捷鍵使用、組合鍵使用等模擬鍵盤的操作热幔。在 WebDeriver 中乐设,有一個專門的類來負責實現(xiàn)這些測試場景,那就是 Actions 類绎巨,在使用該類的過程中會配合使用到 Keys 枚舉以及 Mouse近尚、 Keyboard、CompositeAction 等類认烁。
清單 1. 鼠標左鍵點擊
????????????Actions action = new Actions(driver);action.click();// 鼠標左鍵在當前停留的位置做單擊操作
????????????action.click(driver.findElement(By.name(element)))// 鼠標左鍵點擊指定的元素
清單 2. 鼠標右鍵點擊
????????Actions action = new Actions(driver);
????????action.contextClick();// 鼠標右鍵在當前停留的位置做單擊操作
????????action.contextClick(driver.findElement(By.name(element)))// 鼠標右鍵點擊指定的元素
清單 3. 鼠標雙擊操作
????????Actions action = new Actions(driver);
????????action.doubleClick();// 鼠標在當前停留的位置做雙擊操作
????????action.doubleClick(driver.findElement(By.name(element)))// 鼠標雙擊指定的元素
清單 4. 鼠標拖拽動作
????????Actions action = new Actions(driver);
????????// 鼠標拖拽動作肿男,將 source 元素拖放到 target 元素的位置。
????????action.dragAndDrop(source,target);
????????// 鼠標拖拽動作却嗡,將 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 為橫坐標嘹承,yOffset 為縱坐標窗价。
????????action.dragAndDrop(source,xOffset,yOffset);
????????在這個拖拽的過程中,已經使用到了鼠標的組合動作叹卷,首先是鼠標點擊并按住 (click-and-hold) source 元素撼港,然后執(zhí)行鼠標移動動作 (mouse move)坪它,移動到 target 元素位置或者是 (xOffset, yOffset) 位置,再執(zhí)行鼠標的釋放動作 (mouse release)帝牡。所以上面的方法也可以拆分成以下的幾個執(zhí)行動作來完成:
????????action.clickAndHold(source).moveToElement(target).perform();
????????action.release();
清單 5. 鼠標懸停操作
????????Actions action = new Actions(driver);
????????action.clickAndHold();// 鼠標懸停在當前位置往毡,既點擊并且不釋放
????????action.clickAndHold(onElement);// 鼠標懸停在 onElement 元素的位置
????????action.clickAndHold(onElement) 這個方法實際上是執(zhí)行了兩個動作,首先是鼠標移動到元素 onElement靶溜,然后再 clickAndHold, 所以這個方法也可以寫成 action.moveToElement(onElement).clickAndHold()开瞭。
清單 6. 鼠標移動操作
????????Actions action = new Actions(driver);
????????action.moveToElement(toElement);// 將鼠標移到 toElement 元素中點
????????// 將鼠標移到元素 toElement 的 (xOffset, yOffset) 位置,
????????//這里的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開始的 (x, y) 坐標軸罩息。
????????action.moveToElement(toElement,xOffset,yOffset)
????????// 以鼠標當前位置或者 (0,0) 為中心開始移動到 (xOffset, yOffset) 坐標軸
????????action.moveByOffset(xOffset,yOffset);
????????action.moveByOffset(xOffset,yOffset) 這里需要注意嗤详,如果 xOffset 為負數(shù),表示橫坐標向左移動瓷炮,yOffset 為負數(shù)表示縱坐標向上移動葱色。而且如果這兩個值大于當前屏幕的大小,鼠標只能移到屏幕最邊界的位置同時拋出 MoveTargetOutOfBoundsExecption 的異常娘香。
????????鼠標移動操作在測試環(huán)境中比較常用到的場景是需要獲取某元素的 flyover/tips苍狰,實際應用中很多 flyover 只有當鼠標移動到這個元素之后才出現(xiàn),所以這個時候通過執(zhí)行 moveToElement(toElement) 操作烘绽,就能達到預期的效果舞痰。但是根據我個人的經驗,這個方法對于某些特定產品的圖標诀姚,圖像之類的 flyover/tips 也不起作用响牛,雖然在手動操作的時候移動鼠標到這些圖標上面可以出現(xiàn) flyover, 但是當使用 WebDriver 來模擬這一移動操作時,雖然方法成功執(zhí)行了赫段,但是 flyover 卻出不來呀打。所以在實際應用中,還需要對具體的產品頁面做相應的處理糯笙。
清單 7. 鼠標釋放操
????????Actions action = new Actions(driver);
????????action.release();// 釋放鼠標
selenium顯示等待和隱式等待的區(qū)別
https://www.cnblogs.com/mabingxue/p/10293296.html
? ????????selenium的顯示等待
? ??????????????????原理:顯示等待贬丛,就是明確的要等到某個元素的出現(xiàn)或者是某個元素的可點擊等條件,等不到给涕,就一直等豺憔,除非在規(guī)定的時間之內都沒找到,那么久跳出Exception够庙。
? ??????????????????(簡而言之恭应,就是直到元素出現(xiàn)才去操作,如果超時則報異常)
????WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
????driver:瀏覽器驅動
????timeout:最長超過時間耘眨,默認以秒為單位
????poll_frequency:監(jiān)測的時間間隔昼榛,默認為0.5秒
????ignored_exceptions:超時后的異常信息,默認情況下拋NoSuchElementException異常
????WebDriverWait一般有until和until_not方法配合使用
????until(method,message)
????until_not(method ,message)
? ? ? ? ? selenium的隱式等待
????????????????原理:隱式等待剔难,就是在創(chuàng)建driver時胆屿,為瀏覽器對象創(chuàng)建一個等待時間奥喻,這個方法是得不到某個元素就等待一段時間,直到拿到某個元素位置非迹。
????????????????注意:在使用隱式等待的時候环鲤,實際上瀏覽器會在你自己設定的時間內部斷的刷新頁面去尋找我們需要的元素
????????????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()默認參數(shù)的單位為妙,本例中設置等待時長為10秒憎兽,首先這10秒并非一個固定的等待時間冷离,它并不影響腳本的執(zhí)行速度。其次唇兑,它并不針對頁面上的某一元素進行等待酒朵。當腳本執(zhí)行到某個元素定位是,如果元素可以定位扎附,則繼續(xù)執(zhí)行蔫耽,如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到留夜。假設在第六秒定位到了元素則繼續(xù)執(zhí)行匙铡,若直到超出設置的時長10秒還沒有定位到元素,則拋出異常碍粥。