一饶号、什么是框架
1.框架
框架(framework)是一個(gè)框子 -- 指其約束性扭屁,也是一個(gè)架子 -- 指其支撐性葵腹,是一個(gè)基本概念上的結(jié)構(gòu)带欢,用于去解決或者處理復(fù)雜的問(wèn)題瘤缩。
框架是整個(gè)或部分系統(tǒng)的可重用設(shè)計(jì),表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實(shí)例間交互的方法;另一種定義認(rèn)為,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架峦剔。前者是從應(yīng)用方面而后者是從目的方面給出的定義羹幸。
框架,其實(shí)就是某種應(yīng)用的半成品,就是一組組件虫腋,供你選用完成你自己的系統(tǒng)盒蟆。簡(jiǎn)單說(shuō)就是使用別人搭好的舞臺(tái)荐捻,你來(lái)做表演鸳君。
2.為什么使用框架囱挑?
1)自己從頭實(shí)現(xiàn)太復(fù)雜唆涝。
2)使用框架能夠更專注于業(yè)務(wù)邏輯,加速開發(fā)速度续徽。
3)框架的使用能夠處理更多細(xì)節(jié)問(wèn)題膀斋。
4)使用人數(shù)多,穩(wěn)定性,擴(kuò)展性好
3.selenium工作原理
1)運(yùn)行腳本
2)啟動(dòng)驅(qū)動(dòng)器
3)驅(qū)動(dòng)器打開瀏覽器
4)訪問(wèn)網(wǎng)頁(yè)
4.selenium環(huán)境搭建
1)python3.7
2)Firefox35(大于43)
3)selenium2框架
穩(wěn)定版本2.48.0:pip install selenium==2.48.0
4)瀏覽器驅(qū)動(dòng)
5.selenium對(duì)瀏覽器操作
1)庫(kù)的導(dǎo)入
fromseleniumimportwebdriver
2)創(chuàng)建瀏覽器對(duì)象
driver = webdriver.xxx():必須大寫且加括號(hào)
使用dir(driver)查看方法
3)瀏覽器尺寸相關(guān)操作
maximize_window()# 最大化
get_window_size()# 獲取瀏覽器尺寸败砂,打印查看
set_window_size()# 設(shè)置瀏覽器尺寸祭隔,400*400
4)瀏覽器位置相關(guān)操作
get_window_position()# 獲取瀏覽器位置
set_window_position(x,y)# 設(shè)置瀏覽器位置
5)瀏覽器的關(guān)閉操作
close()# 關(guān)閉當(dāng)前標(biāo)簽/窗口
quit()# 關(guān)閉所有標(biāo)簽/窗口
6)頁(yè)面請(qǐng)求操作
driver.get(url)# 請(qǐng)求某個(gè)url對(duì)應(yīng)的響應(yīng)
refresh()# 刷新頁(yè)面操作
back()# 回退到之前的頁(yè)面
forward()# 前進(jìn)到之后的頁(yè)面
6.selenium獲取斷言信息
什么是斷言
斷言是編程術(shù)語(yǔ)魁袜,表示為一些布爾表達(dá)式脆烟,程序員相信在程序中的某個(gè)特定點(diǎn)該表達(dá)式值為真驼抹,可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測(cè)試時(shí)啟用斷言而在部署時(shí)禁用斷言拜鹤。
獲取斷言信息的操作
current_url 獲取當(dāng)前訪問(wèn)頁(yè)面url
title獲取當(dāng)前瀏覽器標(biāo)題
page_source獲取網(wǎng)頁(yè)源碼
get_screenshot_as_png() 保存圖片
get_screenshot_as_file(file) 直接保存
7.selenium八大元素
# 八大元素定位
# 第一種 id
kw=driver.find_element_by_id('kw')
kw.send_keys('坦克')
kw=driver.find_element(By.ID,'kw')
# 第二種 標(biāo)簽名字
kw=driver.find_element_by_name('wd')
kw=driver.find_element(By.NAME,'wd')
# 第三種 class
kw=driver.find_element_by_class_name('s_ipt')
kw=driver.find_element(By.CLASS_NAME,'s_ipt')
# 第四種? Xpath
kw=driver.find_element_by_xpath(".//*[@id='kw']")
kw=driver.find_element(By.XPATH,".//*[@id='kw']")
# 第五種 css class
kw=driver.find_element_by_css_selector('#kw')
kw=driver.find_element(By.CSS_SELECTOR,'#kw')
# 第六種 test
kw=driver.find_element_by_link_text('新聞')
kw=driver.find_element(By.LINK_TEXT,'新聞')
# 第七種 類似于模糊查詢
kw=driver.find_element_by_partial_link_text('新')
kw=driver.find_element(By.PARTIAL_LINK_TEXT,'新')
# 第八種:標(biāo)簽名定位砂蔽,必須得保證一個(gè)這種名字的標(biāo)簽,使用下面這個(gè)搜索
kw=driver.find_element_by_tag_name('input')
8.元素的操作
對(duì)元素的相關(guān)操作署惯,一般要先獲取到元素左驾,在調(diào)用相關(guān)方法
element = driver.find_element_by_xxx(value)
1)點(diǎn)擊和輸入
點(diǎn)擊操作→element.click()
清空、輸入操作:
element.clear()→清空輸入框element.send_keys(data)→輸入數(shù)據(jù)
2)提交操作
element.submit()
9.多標(biāo)簽之間的切換
1)獲取所有窗口的句柄
handles = driver.window_handlers
2)通過(guò)窗口的句柄進(jìn)入窗口
driver.switch_to_window(handles[n])→方法過(guò)時(shí)了
driver.switch_to.window(handles[n])
10.多表單切換
在網(wǎng)頁(yè)中,表單嵌套是很常見(jiàn)的情況诡右,尤其是在登錄的場(chǎng)景
1)什么是多表單
實(shí)際上就是使用iframe/frame安岂,引用了其他頁(yè)面的鏈接真正的頁(yè)面數(shù)據(jù)并沒(méi)有出現(xiàn)在當(dāng)前源代碼中。
2)處理方法
直接使用id值切換進(jìn)表單
driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表單元素帆吻,在切換進(jìn)入
el = driver.find_element_by_xxx(value)driver.switch_to.frame(el)/driver.switch_to_frame(el)
11.彈出框操作
1)進(jìn)入到彈出框中:driver.switch_to.alert
2)接收警告:accept()
3)解散警告:dismiss()
4)發(fā)送文本到警告框:send_keys(data)用法:driver.switch_to.alert.accept()
12.下拉框
13.鼠標(biāo)和鍵盤操作
1)鼠標(biāo)操作
導(dǎo)入動(dòng)作鏈類域那,動(dòng)作鏈可以存儲(chǔ)鼠標(biāo)的動(dòng)作,并一起執(zhí)行
fromselenium.webdriverimportActionChains
ActionChains(driver)
鼠標(biāo)右擊
el=driver.find_element_by_xxx(value)
context_click(el)
對(duì)el執(zhí)行右擊
執(zhí)行ActionChains中存儲(chǔ)的所有操作
perform()
常用鼠標(biāo)動(dòng)作
ActionChains(driver).context_click(ele).perform()# 點(diǎn)擊鼠標(biāo)右鍵 ?
ActionChains(driver).double_click(ele).perform()# 點(diǎn)擊鼠標(biāo)左鍵
ActionChains(driver).move_to_element(el).perform()? ? # 鼠標(biāo)懸停
2)鍵盤操作
鍵盤操作使用的是keys類猜煮,一般配合snd_keys使用
導(dǎo)入
fromselenium.webdriver.common.keysimportKeys
常用鍵盤操作
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(chǎn)’)# 全選(Ctrl+A)
send_keys(Keys.CONTROL,‘a(chǎn)’)# 全選(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
14.瀏覽器等待
1)為什么要進(jìn)行等待次员?
網(wǎng)速慢
網(wǎng)站內(nèi)容過(guò)多
如果不進(jìn)行等待而直接定位元素,可能會(huì)拋出異常
2)selenium中等待的分類
顯示等待
顯示等待是根據(jù)條件進(jìn)行等待王带,等待條件出現(xiàn)
fromselenium.webdriver.common.byimportBy
fromselenium.webdriver.support.uiimportWebDriverWait
fromselenium.webdriver.supportimportexpected_conditionsasEC
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
隱示等待
隱示等待是根據(jù)事件進(jìn)行等待淑蔚,等待特定事件
driver.implicitly_wait(n)
15.IDE功能介紹
文件:創(chuàng)建、打開和保存測(cè)試案例和測(cè)試案例集愕撰。編輯:復(fù)制刹衫、粘貼、刪除搞挣、撤銷和選擇測(cè)試案例中的所有命令带迟。Options : 用于設(shè)置seleniunm IDE。
用來(lái)填寫被測(cè)網(wǎng)站的地址囱桨。
速度控制:控制案例的運(yùn)行速度仓犬。
運(yùn)行所有:運(yùn)行一個(gè)測(cè)試案例集中的所有案例。
運(yùn)行:運(yùn)行當(dāng)前選定的測(cè)試案例舍肠。
暫停/恢復(fù):暫停和恢復(fù)測(cè)試案例執(zhí)行婶肩。
單步:可以運(yùn)行一個(gè)案例中的一行命令。
錄制:點(diǎn)擊之后貌夕,開始記錄你對(duì)瀏覽器的操作律歼。
案例集列表。
測(cè)試腳本啡专;table標(biāo)簽:用表格形式展現(xiàn)命令及參數(shù)险毁。source標(biāo)簽:用原始方式展現(xiàn),默認(rèn)是HTML語(yǔ)言格式们童,也可以用其他語(yǔ)言展示畔况。
查看腳本運(yùn)行通過(guò)/失敗的個(gè)數(shù)。
當(dāng)選中前命令對(duì)應(yīng)參數(shù)慧库。
日志/參考/UI元素/Rollup
16.代碼案例
fromseleniumimportwebdriver
fromselenium.webdriver.common.byimportBy
fromselenium.webdriver.common.keysimportKeys
fromselenium.webdriver.support.uiimportSelect
fromselenium.common.exceptionsimportNoSuchElementException
fromselenium.common.exceptionsimportNoAlertPresentException
importunittest,time,re
classQq(unittest.TestCase):
defsetUp(self):
self.driver=webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url="https://qzone.qq.com/"
self.verificationErrors= []
self.accept_next_alert=True
deftest_qq(self):
driver=self.driver
driver.get(self.base_url+"/")
# 定位
driver.switch_to.frame(driver.find_element_by_id("login_frame"))
driver.find_element_by_id("switcher_plogin").click()
# driver.find_element_by_id("uin_del").click()
driver.find_element_by_id("u").clear()
driver.find_element_by_id("u").send_keys("3084761668")
driver.find_element_by_id("p").clear()
driver.find_element_by_id("p").send_keys("dafei123457")
driver.find_element_by_id("login_button").click()
# ERROR: Caught exception [ERROR: Unsupported command [selectWindow | null | ]]
# driver.find_element_by_id("tcaptcha_drag_thumb").click()
# self.assertEqual(driver.title,"QQ空間")
self.assertIn("QQ11空間",driver.title)
defis_element_present(self,how,what):
try:self.driver.find_element(by=how,value=what)
exceptNoSuchElementExceptionase:returnFalse
returnTrue
defis_alert_present(self):
try:self.driver.switch_to_alert()
exceptNoAlertPresentExceptionase:returnFalse
returnTrue
defclose_alert_and_get_its_text(self):
try:
alert=self.driver.switch_to_alert()
alert_text=alert.text
ifself.accept_next_alert:
alert.accept()
else:
alert.dismiss()
returnalert_text
finally:self.accept_next_alert=True
deftearDown(self):
self.driver.quit()
self.assertEqual([],self.verificationErrors)
if__name__=="__main__":
unittest.main()