1. 什么是框架
框架(framework)是一個框子 -- 指其約束性砰盐,也是一個架子 -- 指其支撐性辞嗡,是一個基本概念上的結(jié)構(gòu),用于去解決或者處理復(fù)雜的問題兔朦。
框架是整個或部分系統(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)。簡單說就是使用別人搭好的舞臺绍豁,你來做表演芯咧。
2. 為什么使用框架
1)自己從頭實(shí)現(xiàn)太復(fù)雜
2)使用框架能夠更專注于業(yè)務(wù)邏輯,加快開發(fā)速度
3)框架的使用能夠處理更多細(xì)節(jié)問題
4)使用人數(shù)多竹揍,穩(wěn)定性敬飒,擴(kuò)展性好
3. selenium工作原理
-
原理:webdriver是按照server–client的經(jīng)典設(shè)計(jì)模式設(shè)計(jì)的。
server端就是remote server芬位,可以是任意的瀏覽器无拗。當(dāng)我們的腳本啟動瀏覽器后,該瀏覽器就是remote server昧碉,它的職責(zé)就是等待client發(fā)送請求并做出相應(yīng)英染;client端簡單說來就是我們的測試代碼,我們測試代碼中的一些行為被饿,比如打開瀏覽器四康,轉(zhuǎn)跳到特定的url等操作是以http請求的方式發(fā)送給被測試瀏覽器,也就是remote server狭握;remote server接受請求闪金,并執(zhí)行相應(yīng)操作,并在response中返回執(zhí)行狀態(tài)论颅、返回值等信息哎垦。
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ū)動
下載谷歌驅(qū)動
selenium之 chromedriver與chrome版本映射表
Firefox瀏覽器對應(yīng)各個版本驅(qū)動下載地址
firefox各個版本安裝包的下載地址
注意:Firefox35(大于43)版本不需要下載驅(qū)動器,大于這個版本的需要恃疯,Chrome需要下載驅(qū)動器漏设,下邊分別演示。
5. selenium對瀏覽器操作
1)庫的導(dǎo)入
from selenium import webdriver
2)創(chuàng)建瀏覽器對象
driver = webdriver.xxx()
使用dir(driver)查看方法
# 必須為大寫
driver = webdriver.Firefox()
driver = webdriver.Chrome()
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è)置瀏覽器位置
注意:顯示器以左上角為(0,0),所有的位置操作都是相對于顯示器左上角展開的位移操作鸳碧,單位是像素。
5)瀏覽器的關(guān)閉操作
close() 關(guān)閉當(dāng)前標(biāo)簽/窗口
quit() 關(guān)閉所有標(biāo)簽/窗口
6)頁面請求操作
driver.get(url) 請求某個url對應(yīng)的響應(yīng)
refresh() 刷新頁面操作
back() 回退到之前的頁面
forward() 前進(jìn)到之后的頁面
- 案例
from selenium import webdriver
import time
# driver = webdriver.Chrome()#不可以找到潘酗,必須導(dǎo)入對應(yīng)的驅(qū)動器
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)
# 前進(jìn)
driver.forward()
time.sleep(3)
driver.close()
6. selenium獲取斷言信息
6.1 什么是斷言
斷言是編程術(shù)語杆兵,表示為一些布爾表達(dá)式,程序員相信在程序中的某個特定點(diǎn)該表達(dá)式值為真仔夺,可以在任何時候啟用和禁用斷言驗(yàn)證琐脏,因此可以在測試時啟用斷言而在部署時禁用斷言。
6.2 獲取斷言信息的操作
- current_url 獲取當(dāng)前訪問頁面url
- title 獲取當(dāng)前瀏覽器標(biāo)題
- page_source 獲取網(wǎng)頁源碼
print(driver.current_url)
print(driver.title)
print(driver.page_source)
- get_screenshot_as_png() 保存圖片
data = driver.get_screenshot_as_png()
with open("a.png", "wb") as f:
f.write(data)
- get_screenshot_as_file(file) 直接保存
driver.get_screenshot_as_file("b.png")
7. 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) # 輸入數(shù)據(jù)
# from selenium.webdriver.common.by import By
# ele = driver.find_element(By.ID,"kw")
# ele.send_keys(12306) # 輸入數(shù)據(jù)
# 第二種 標(biāo)簽名字
# ele = driver.find_element_by_name("wd")
# ele.send_keys(12306) # 輸入數(shù)據(jù)
# 第三種 class
# ele = driver.find_element_by_class_name("s_ipt")
# ele.send_keys(12306) # 輸入數(shù)據(jù)
# 第四種 Xpath
# ele = driver.find_element_by_xpath("http://*[@id='kw']")
# ele.send_keys(12306) # 輸入數(shù)據(jù)
# 第五種 css class
# ele = driver.find_element_by_css_selector("#kw")
# ele.send_keys(12306) # 輸入數(shù)據(jù)
# 第六種 text
# ele = driver.find_element_by_link_text("地圖")
# ele.click() # 輸入數(shù)據(jù)
# 第七種:類似于模糊匹配
# ele = driver.find_element_by_partial_link_text("地")
# ele.click()
# 第八種:標(biāo)簽名定位缸兔,必須得保證只有一個這種名字的標(biāo)簽日裙,使用下面這個搜索
# url = "http://cn.bing.com/"
# driver.get(url)
# ele = driver.find_element_by_tag_name("input")
# ele.send_keys(12306) # 輸入數(shù)據(jù)
8. 元素的操作
對元素的相關(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ù)
- 案例
1.打開百度搜索
2.搜索關(guān)鍵字 selenium
3.清空
4.搜索python
2)提交操作
element.submit()
9. 多標(biāo)簽之間的切換
場景:有的時候點(diǎn)擊一個鏈接昂拂,新頁面并非由當(dāng)前頁面跳轉(zhuǎn)過去,而是新開一個頁面打開抛猖,這種情況下格侯,計(jì)算機(jī)需要識別多標(biāo)簽或窗口的情況。
1)獲取所有窗口的句柄
handles = driver.window_handlers
調(diào)用該方法會得到一個列表财著,在selenium運(yùn)行過程中的每一個窗口都有一個對應(yīng)的值存放在里面联四。
2)通過窗口的句柄進(jìn)入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通過窗口句柄激活進(jìn)入某一窗口
- 案例:58同城租房信息:http://bj.58.com
driver.get("http://bj.58.com")
ele = driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")
ele.click()
# 直接報(bào)錯,原因是需要句柄
eleDaxing = driver.find_element_by_link_text("大興")
eleDaxing.click()
# 使用句柄
driver.get("http://bj.58.com")
print("點(diǎn)擊之前句柄:", driver.window_handles)
ele = driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")
ele.click()
list_windowns = driver.window_handles
print("點(diǎn)擊之后句柄:", driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing = driver.find_element_by_link_text("大興")
eleDaxing.click()
10. 多表單切換
在網(wǎng)頁中撑教,表單嵌套是很常見的情況朝墩,尤其是在登錄的場景
10.1 什么是多表單
實(shí)際上就是使用iframe/frame,引用了其他頁面的鏈接伟姐,真正的頁面數(shù)據(jù)并沒有出現(xiàn)在當(dāng)前源碼中收苏,但是在瀏覽器中我們看到,簡單理解可以使頁面中開了一個窗口顯示另一個頁面
10.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)
- 案例:QQ空間:https://qzone.qq.com/
from selenium import webdriver
#打開游覽器
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()
11. 彈出框操作
- 進(jìn)入到彈出框中
driver.switch_to.alert - 接收警告
accept() - 解散警告
dismiss()
發(fā)送文本到警告框
send_keys(data)
用法:driver.switch_to.alert.accept()
- 案例:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele_setting = driver.find_element_by_id("s-usersetting-top")
ele_setting.click()
ele_gaoji = driver.find_element_by_class_name("setpref")
ele_gaoji.click()
ele_save = driver.find_element_by_class_name("prefpanelgo")
ele_save.click()
driver.switch_to.alert.accept()
12.下拉框
from selenium import webdriver
import time
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()
13. 鼠標(biāo)和鍵盤操作
手動測試時鍵盤的操作在selenium頁有實(shí)現(xiàn)鹿霸,關(guān)于鼠標(biāo)的操作由ActionChains()類來提供,關(guān)于鍵盤的操作由Key()類來提供
1)鼠標(biāo)操作
- 導(dǎo)入動作鏈類秆乳,動作鏈可以儲存鼠標(biāo)的動作懦鼠,并一起執(zhí)行
from selenium.webdriver import ActionChains
ActionChains(driver)
- 鼠標(biāo)右擊
el = driver.find_element_by_xxx(value)
context_click(el)
對el執(zhí)行右擊
- 執(zhí)行ActionChains中儲存的所有動作
perform()
- 常用鼠標(biāo)動作:
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)懸停
- 案例
from selenium.webdriver import ActionChains
from selenium import webdriver
import time
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()
2)鍵盤操作
鍵盤操作使用的是Keys類,一般配合send_keys使用
-
導(dǎo)入
from selenium.webdriver.common.keys import Keys
-
常用鍵盤操作
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)行等待?
1.網(wǎng)速慢
2.網(wǎng)站內(nèi)容過多
3.如果不進(jìn)行等待而直接定位元素矫夷,可能會拋出異常
2) selenium中等待的分類:
- 顯示等待
顯示等待是根據(jù)條件進(jìn)行等待,等待條件出現(xiàn)
實(shí)現(xiàn):
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
WebDriverWait類是由WebDirver 提供的等待方法憋槐。在設(shè)置時間內(nèi)双藕,默認(rèn)每隔一段時間檢測一次當(dāng)前頁面元素是否存在,如果超過設(shè)置時間檢測不到則拋出異常阳仔。
- 案例
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
(By.CLASS_NAME,"g-hu")))
- 思考:顯示等待與time的區(qū)別忧陪?
-
隱式等待
隱式等待是根據(jù)是件進(jìn)行等待,等待特定時間driver.implicitly_wait(n)
n的單位為秒,n為最大值扣泊,在這個最大值內(nèi)只要該界面上的全部元素都加載完成定就結(jié)束沒有加載出元素就拋出 NosuchException.
注意:優(yōu)先隱式等待,次之顯式等待嘶摊,最次固定等待