1. 什么是框架
框架(framework)是一個框子 -- 指其約束性不脯,也是一個架子 -- 指其支撐性悲幅,是一個基本概念上的結(jié)構(gòu)躏嚎,用于去解決或者處理復(fù)雜的問題慨丐。
2. 為什么使用框架
1)自己從頭實(shí)現(xiàn)太復(fù)雜
2)使用框架能夠更專注于業(yè)務(wù)邏輯祟身,加快開發(fā)速度
3)框架的使用能夠處理更多細(xì)節(jié)問題
4)使用人數(shù)多奥务,穩(wěn)定性,擴(kuò)展性好
3. selenium工作原理
4.selenium對瀏覽器操作
1)庫的導(dǎo)入
from selenium import webdriver
2)創(chuàng)建瀏覽器對象
# 必須為大寫
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è)置瀏覽器位置
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)到之后的頁面
fromselenium 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()
5.selenium獲取斷言信息
1)什么是斷言
斷言是編程術(shù)語婉陷,表示為一些布爾表達(dá)式溢谤,程序員相信在程序中的某個特定點(diǎn)該表達(dá)式值為真瞻凤,可以在任何時候啟用和禁用斷言驗(yàn)證,因此可以在測試時啟用斷言而在部署時禁用斷言世杀。
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()
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) # 輸入數(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ù)
7.元素的操作
對元素的相關(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()
8.多標(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")
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()
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()
彈出框操作
# 進(jìn)入到彈出框中
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()
鼠標(biāo)和鍵盤操作
鼠標(biāo)
1.先導(dǎo)入動作鏈類:
fromselenium.webdriverimportActionChains
ActionChains(driver)
2.常用鼠標(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)懸停
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.導(dǎo)入
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(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
瀏覽器等待
1.為什么要進(jìn)行等待
1.網(wǎng)速慢 2.網(wǎng)站內(nèi)容過多 3.如果不進(jìn)行等待而直接定位元素斩披,可能會拋出異常
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)