十八單元 自動化持續(xù)繼承
1.概念
1.持續(xù)集成:持續(xù)的將分支集成到主干
2.持續(xù)交付:持續(xù)將此版本提交給質量團隊
3.持續(xù)部署:持續(xù)將代碼部署到生產環(huán)境
2.Jenkins介紹
1.概念:Jenkins 是一個開源軟件項目拥娄,是基于Java開發(fā)的一種可拓展持續(xù)集成工具够挂,主要用于持 續(xù)抡锈、自動 地構建 / 測試 / 集成軟件項目以及監(jiān)控一些定時執(zhí)行的任務
2.部署:配置java環(huán)境→安裝Tomcat→jenkins.war放在webapps下→啟動Tomcat→訪問:
(127.0.0.1)localhost:8080/jenkins
3.使用:創(chuàng)建條目 自動構建
3.搭建Jmeter+Jenkins+Ant持續(xù)化
第十九單元 web端自動化
1.什么是自動化
使用測試工具 或者其他手段對軟件進行測試
2.自動化測試好處
1.縮短測試周期? 2.避免人為出錯? 3.測試信息存儲? 4.輕易獲取覆蓋率? 5.實現自動或者定時執(zhí)行
3.使用自動化的前提條件
1)手動測試已經完成,后期再不影響進度的前提下逐漸實現自動化
2)項目周期長,重復性的工作都交給機器去實現
3)需求穩(wěn)定,項目變動不大
4)自動化測試腳本復雜度比較低
5)可重復利用
4.使用自動化測試的場景
1)頻繁的回歸測試
2)冒煙測試
3)傳統(tǒng)行業(yè)需求變化不大器紧,應用頻繁
4)性能測試
5.常用工具
QTP、Selenium、RFT
6.為什么要學習元素定位
1)計算機沒有智能到人的程度敦跌。
2)計算機不能像手動測試人員一樣通過眼看,手操作鼠標點擊,操作鍵盤輸入柠傍。
3)計算機通過一系列計數手段找到元素(按鈕麸俘、輸入框、模擬鍵盤等)
7.元素定位的工具或手段有哪些
css選擇器惧笛、xpath
8.環(huán)境搭建
1. 下載瀏覽器插件
2. 菜單 → 添加附件 → 設置圖標 → 從文件中添加附件
9.什么是xpath
XPath即為XML路徑語言从媚,它是一種用來(標準通用標記語言的子集)在 HTML\XML 文檔中查找信息的語言
10.什么是xml
XML 指可擴展標記語言(EXtensible Markup Language)
XML 是一種標記語言,很類似 HTML
XML 的設計宗旨是傳輸數據患整,而非顯示數據
11.xml和html 的區(qū)別
html是用來顯示數據拜效、xml是用來傳輸和存儲數據
12.獲取元素
①/:從根節(jié)點選取? #/html/head/meta[1]第一個;[last()]最后一個元素各谚;[last()-1]倒數第二個元素紧憾;? ? ? ? ? ? ? ? ? ? [position()<3] 前兩個元素
②//:從匹配選擇的當前節(jié)點選擇文檔中的節(jié)點 #//link
③.選取當前節(jié)點
④..選取當前節(jié)點的父節(jié)點
⑤@:選取屬性 #//meta[@name] 或者//meta[@name="referrer"]
⑥//meta[@*]:所有帶有屬性的meta元素
⑦//head/meta | //head/title:選取head元素的所有meta元素和title元素
⑧//meta | //title:選取文檔中的所有title和meta元素
13.css選擇器
13.1什么是css選擇器
CSS 中,選擇器是一種模式昌渤,用于選擇需要添加樣式的元素
13.2css選擇器語法
①.info: 選擇class=“info”的所有元素
②#name: 選擇id=“name”的所有元素
③* :選擇所有的元素
④元素1,元素2: 選擇元素1和元素2的所有元素
⑤元素1 元素2: 選擇元素1內部的所有元素2的元素
⑥元素1>元素2: 選擇父元素為元素1的元素的所有元素2的元素
⑦[target]: 選擇帶有target屬性的所有元素
⑧[target=blank]: 選擇target="blank"的所有元素
Web自動化測試進階
什么是框架框架(framework)是一個框子 -- 指其約束性赴穗,也是一個架子 -- 指其支撐性,是一個基本概念上的結構膀息,用于去解決或者處理復雜的問題般眉。
為什么使用框架1)自己從頭實現太復雜
? 2)使用框架能夠更專注于業(yè)務邏輯,加快開發(fā)速度
? 3)框架的使用能夠處理更多細節(jié)問題
? 4)使用人數多潜支,穩(wěn)定性甸赃,擴展性好
selenium工作原理
? 4.selenium對瀏覽器操作
1)庫的導入
from selenium import webdriver
2)創(chuàng)建瀏覽器對象
必須為大寫
driver = webdriver.Firefox()
driver = webdriver.Chrome()
3)瀏覽器尺寸相關操作
maximize_window() 最大化
get_window_size()? ? 獲取瀏覽器尺寸,打印查看
set_window_size()? ? 設置瀏覽器尺寸冗酿,400*400
4)瀏覽器位置相關操作
get_window_position() 獲取瀏覽器位置
set_window_position(x,y)? ? 設置瀏覽器位置
5)瀏覽器的關閉操作
close()關閉當前標簽/窗口
quit()關閉所有標簽/窗口
6)頁面請求操作
driver.get(url)請求某個url對應的響應
refresh()刷新頁面操作
back()回退到之前的頁面
forward()前進到之后的頁面
fromselenium import webdriver
import time
driver = webdriver.Chrome()#不可以找到埠对,必須導入對應的驅動器
driver=webdriver.Firefox()
url1="http://www.baidu.com"
url2="https://zhuanlan.zhihu.com/"
請求第一個接口
driver.get(url1)
time.sleep(3)
刷新
driver.refresh()
driver.get(url2)
回退
driver.back()time.sleep(3)
前進driver.forward()
time.sleep(3)
driver.close()
5.selenium獲取斷言信息1)什么是斷言
斷言是編程術語,表示為一些布爾表達式已烤,程序員相信在程序中的某個特定點該表達式值為真鸠窗,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言胯究。
2)獲取斷言信息的操作
current_url 獲取當前訪問頁面url
title 獲取當前瀏覽器標題
page_source 獲取網頁源碼
print(driver.current_url)
print(driver.title)
print(driver.page_source)
截圖:
get_screenshot_as_png() 保存圖片
data=driver.get_screenshot_as_png()
withopen("a.png","wb")asf:
f.write(data)
get_screenshot_as_file(file) 直接保存
driver.get_screenshot_as_file("b.png")
6.selenium八大元素定位from selenium import webdriver
driver=webdriver.Firefox()
url = "http://www.baidu.com"
driver.get(url)
第一種 id
ele = driver.find_element_by_id("kw")
ele.send_keys(12306) # 輸入數據
from selenium.webdriver.common.by import By
ele = driver.find_element(By.ID,"kw")# ele.send_keys(12306) # 輸入數據
第二種? 標簽名字
ele = driver.find_element_by_name("wd")
ele.send_keys(12306) # 輸入數據
第三種? class
ele = driver.find_element_by_class_name("s_ipt")
ele.send_keys(12306) # 輸入數據
第四種? Xpath
ele = driver.find_element_by_xpath("http://*[@id='kw']")
ele.send_keys(12306) # 輸入數據
第五種? css class
ele = driver.find_element_by_css_selector("#kw")
ele.send_keys(12306) # 輸入數據
第六種? text
ele = driver.find_element_by_link_text("地圖")
ele.click() # 輸入數據
第七種:類似于模糊匹配
ele = driver.find_element_by_partial_link_text("地")
ele.click()
第八種:標簽名定位稍计,必須得保證只有一個這種名字的標簽,使用下面這個搜索
url = "http://cn.bing.com/"
driver.get(url)# ele = driver.find_element_by_tag_name("input")
ele.send_keys(12306) # 輸入數據
7.元素的操作對元素的相關操作裕循,一般要先獲取到元素臣嚣,再調用相關方法
element = driver.find_element_by_xxx(value)
1)點擊和輸入
點擊操作---------->element.click()
清空/輸入操作:
element.clear()---------------------->清空輸入框
element.send_keys(data)-------->輸入數據
2)提交操作
element.submit()
8.多標簽之間的切換場景:有的時候點擊一個鏈接,新頁面并非由當前頁面跳轉過去剥哑,而是新開一個頁面打開硅则,這種情況下,計算機需要識別多標簽或窗口的情況株婴。
1)獲取所有窗口的句柄
handles = driver.window_handlers
調用該方法會得到一個列表怎虫,在selenium運行過程中的每一個窗口都有一個對應的值存放在里面暑认。
2)通過窗口的句柄進入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通過窗口句柄激活進入某一窗口
案例:
58同城租房信息:http://bj.58.com
使用句柄driver.get("http://bj.58.com")
print("點擊之前句柄:",driver.window_handles)
ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()
list_windowns=driver.window_handles
print("點擊之后句柄:",driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing=driver.find_element_by_link_text("大興")
eleDaxing.click()
9.多表單
? ? el = driver.find_element_by_xxx(value)
? ? driver.switch_to.frame(el)/driver.switch_to_frame(el)
案例:
fromseleniumimportwebdriver
#打開游覽器
driver=webdriver.Firefox()
#登錄QQ
url="https://qzone.qq.com/"
driver.get(url)
#獲取元素
#定位表單元素
ele_bd=driver.find_element_by_id("login_frame")
driver.switch_to.frame(ele_bd)
ele=driver.find_element_by_xpath(".//*[@id='switcher_plogin']")
ele.click()
#輸入賬號
ele2=driver.find_element_by_id("u")
ele2.send_keys()
#輸入密碼
ele3=driver.find_element_by_id("p")
ele3.send_keys("")
ele4=driver.find_element_by_id("login_button")
ele4.click()
彈出框操作
# 進入到彈出框中
driver.switch_to.alert
#接收警告
accept()
#解散警告
dismiss()
#發(fā)送文本到警告框
send_keys(data)
用法:driver.switch_to.alert.accept()
下拉框
案例:
fromseleniumimportwebdriver
importtime
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
ele=driver.find_element_by_id("s-usersetting-top")
ele.click()
ele1=driver.find_element_by_xpath(".//*[@id='s-user-setting-menu']/div/a[2]")
ele1.click()
time.sleep(2)
ele2=driver.find_element_by_xpath(".//*[@id='yadv-setting-gpc']/div/div[1]/i[1]")
ele2.click()
list_ele=driver.find_elements_by_class_name("c-select-item")
print(list_ele)
list_ele[2].click()
# for list_i in list_ele:
# ? ? print(list_i.text)
# ? ? if list_i.text =="最近一周":
# ? ? ? ? list_i.click()
鼠標和鍵盤操作
鼠標
1.先導入動作鏈類:
fromselenium.webdriverimportActionChains
ActionChains(driver)
2.常用鼠標動作:
ActionChains(driver).context_click(ele).perform()點擊鼠標右鍵
ActionChains(driver).double_click(ele).perform()點擊鼠標左鍵
ActionChains(driver).move_to_element(el).perform()鼠標懸停
3.perform()對前面的方法執(zhí)行
#案例:
fromselenium.webdriverimportActionChains
fromseleniumimportwebdriver
importtime
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
ele=driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")
# ele.click()
ActionChains(driver).double_click(ele).perform()
鍵盤
1.導入
fromselenium.webdriver.common.keysimportKeys
2.常用鍵盤操作
send_keys(Keys.BACK_SPACE) ?? 刪除鍵(BackSpace)
send_keys(Keys.SPACE) ? ? ? ? 空格鍵(Space)
send_keys(Keys.TAB) ? ? ? ? ? 制表鍵(Tab)
send_keys(Keys.ESCAPE) ? ? ?? 回退鍵(Esc)
send_keys(Keys.ENTER) ? ? ? ? 回車鍵(Enter)
send_keys(Keys.CONTROL,‘a’) ? 全選(Ctrl+A)
send_keys(Keys.CONTROL,‘a’) ? 全選(Ctrl+A)
send_keys(Keys.CONTROL,‘x’) ? 剪切(Ctrl+X)
send_keys(Keys.CONTROL,‘v’) ? 粘貼(Ctrl+V)
send_keys(Keys.F1) ? ? ? ? ?? 鍵盤F1
send_keys(Keys.F12) ? ? ? ? ? 鍵盤F12
瀏覽器等待
1.為什么要進行等待
1.網速慢 2.網站內容過多 3.如果不進行等待而直接定位元素,可能會拋出異常
2.selenium中等待的分類
1.固定等待
2.顯示等待
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
(By.CLASS_NAME,"g-hu")))
3.隱式等待?
driver.implicitly_wait(n)
PO模型
1.介紹
在自動化中大审,Selenium自動化測試中有一個名字經常被提及PageObject(思想與 面向對象的特征相同)蘸际,通常PO模型可以大大提高測試用例的維護效率
優(yōu)點:重用,業(yè)務和對象分離徒扶,代碼結構清晰粮彤,方便代碼維護
2.核心要素
1.在PO模式中抽離封裝集成一個BasePage類,該基類應該擁有一個只實現 webdriver實例的屬性
2.每一個page都繼承BasePage姜骡,通過driver來管理本page中元素导坟,將page中 的操作封裝成一個個方法
3.TestCase繼承unittest.Testcase類,并依賴page類圈澈,從而實現相應的測試步 驟
3.實現BasePage
fromseleniumimportwebdriver
fromselenium.webdriver.common.action_chainsimportActionChains#鼠標操作
classBasePage():
'''BasePage封裝所有界面都公用的方法惫周。例如driver,find_element等'''
'''實例化BasePage類時,事先執(zhí)行的__init__方法士败,該方法需要傳遞參數'''
def__init__(self,driver,url):
self.driver=driver
self.base_url=url
# 進入網址
defget(self):
self.driver.get(self.base_url)
#元素定位,替代八大定位
defget_element(self,*locator):
returnself.driver.find_element(*locator)
#點擊
defleft_click(self,*locator):
ActionChains(self.driver).click(self.get_element(*locator)).perform()
#輸入
defsend_text(self,text,*locator):
self.driver.find_element(*locator).send_keys(text)
#清除
defclear_text(self,*locator):
self.driver.find_element(*locator).clear()
實現SearchPage
'''
實現步驟:(1)繼承basepage,(2)元素傳參,(3)調取方法
'''
fromselenium.webdriver.common.byimportBy
frompomodel.Base.base_pageimportBasePage
classSearch(BasePage):
def__init__(self,driver,url):
BasePage.__init__(self,driver,url)
#進入百度
defopen_baidu(self):
self.get()
#輸入搜索內容
definput_search_content(self,text):
self.send_text(text,By.ID,"kw")
#點擊按鈕
defclick_baidu_search(self):
self.left_click(By.ID,"su")
實現TestCase
importunittest
fromseleniumimportwebdriver
frompomodel.Pages.search_pagesimportSearch
classBaiBu(unittest.TestCase):
defsetUp(self)->None:
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(10)
deftest_serach(self):
url="http://www.baidu.com"
s=Search(self.driver,url)
s.open_baidu()
s.input_search_content("jack")
s.click_baidu_search()
deftearDown(self)->None:
self.driver.quit()
if__name__=='__main__':
unittest.main()
4.總結
PO設計模式中的BasePage基類對應案例中的BasePage.py文件 PO模式中的pages中的案例顯示Search.py PO模式設計中TestCase對應案例中的TestCase.py
5.po模式的優(yōu)點
1.PO提供了一種業(yè)務流程與頁面元素操作分離的模式闯两,這使得測試代碼變得更加清晰
2.頁面對象與用例分離褥伴,使得我們更好的復用對象
3.可復用的頁面方法代碼會變得更加優(yōu)化
4.更加有效的命令方式使得我們更加清晰的知道方法所操作的UI元素