引言:
大家都知道素征,基于Web端的測(cè)試的基礎(chǔ)框架是需要Selenium做主要支撐的,這里邊給大家介紹下Web測(cè)試核心之基于 Python 的 Selenium
一、簡(jiǎn)單介紹
Selenium 是用于測(cè)試 Web 應(yīng)用程序用戶界面 (UI) 的常用框架。它是一款用于運(yùn)行端到端功能測(cè)試的超強(qiáng)工具。您可以使用多個(gè)編程語(yǔ)言編寫(xiě)測(cè)試崇猫,并且 Selenium 能夠在一個(gè)或多個(gè)瀏覽器中執(zhí)行這些測(cè)試。
?
二需忿、環(huán)境安裝
安裝 python诅炉,這個(gè)。屋厘。涕烧。忽略,建議 python2.7汗洒。
安裝基于 python 的 selenium 依賴包议纯,命令:pip install selenium==2.53.6,你懂的溢谤。
安裝瀏覽器驅(qū)動(dòng)包瞻凤,推薦使用 chrome 瀏覽器的chromedriver.exe,對(duì)應(yīng) chrome 版本一定要對(duì)哦世杀,不然運(yùn)行不起來(lái)的阀参,安裝在哪?想放哪放哪玫坛,不過(guò)一般是放在 python 的根目錄下结笨。
安裝 PyCharm 2.7 左右版本包晰,這個(gè)無(wú)腦安裝~然后可自定義界面 UI 及編碼風(fēng)格湿镀,這個(gè)。伐憾。勉痴。忽略
三、牛刀小試
1. 控制瀏覽器
#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window() #將瀏覽器最大化顯示
driver.set_window_size(480, 800) #設(shè)置瀏覽器寬480树肃、高800顯示"
driver.back() #后退
driver.forward() #前進(jìn)
driver.close() #關(guān)閉chrome
driver.quit() # 退出chrome
復(fù)制代碼
2. 對(duì)象的定位
通過(guò) id 定位:find_element_by_id()
通過(guò) name 定位:find_element_by_name()
通過(guò) class 定位:find_element_by_class_name()
通過(guò) tag 定位:find_element_by_tag_name()
通過(guò) link 定位:find_element_by_link_text()
通過(guò) partial_link 定位:find_element_by_partial_link_text()
通過(guò) xpath 定位:find_element_by_xpath()
通過(guò) css 定位:find_element_by_css_selector()
以上幾種定位是常規(guī)操作蒸矛,應(yīng)該就基本夠用了,但是有的時(shí)候就是會(huì)出現(xiàn)一些詭異的定位失效或者定位到了點(diǎn)擊失效的問(wèn)題胸嘴,這個(gè)時(shí)候如果用js進(jìn)行直接執(zhí)行該事件雏掠,接下來(lái)介紹下非常規(guī)操作:
id 定位:document.getElementById()
name 定位:document.getElementsByName()
tag 定位:document.getElementsByTagName()
class 定位:document.getElementsByClassName()
css 定位:document.querySelectorAll()
? search_js = "document.getElementsByName('wd')[0].value='selenium';"# 通過(guò)name定位,然后賦值“selenium”
? search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"# 通過(guò)css定位劣像,然后賦值“selenium”
? button_js = "document.getElementById('su').click();"# 通過(guò)id定位乡话,然后執(zhí)行單擊操作
? button_js2 = "document.getElementsByClassName('s_btn')[0].click()"# 通過(guò)className定位,然后執(zhí)行單擊操作 driver.execute_script(search_js2)#執(zhí)行耳奕,execute_script(script, *args)
復(fù)制代碼
以上幾種定位是可以再度升級(jí)绑青,可以利用 jQuery 定位一波诬像,這里可參看之前總結(jié)的 JQ 選擇器中的思維導(dǎo)圖知識(shí)點(diǎn)
3.操作測(cè)試對(duì)象
#coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://passport.kuaibo.com/login/")
driver.find_element_by_id("user_name").clear() #清除輸入框的默認(rèn)內(nèi)容
driver.find_element_by_id("user_name").send_keys("username")
driver.find_element_by_id("user_pwd").clear()
driver.find_element_by_id("user_pwd").send_keys("password") #輸入輸入框的內(nèi)容為“password”
driver.find_element_by_id("dl_an_submit").click() #通過(guò) submit() 來(lái)提交操作
driver.find_element_by_id("dl_an_submit").submit()
size=driver.find_element_by_id("kw").size #返回百度輸入框的寬高 text=driver.find_element_by_id("cp").text #返回百度頁(yè)面底部備案信息
#返回元素的屬性值,可以是 id闸婴、name坏挠、type 或元素?fù)碛械钠渌我鈱傩?/p>
attribute=driver.find_element_by_id("kw").get_attribute('type') #返回元素的結(jié)果是否可見(jiàn),返回結(jié)果為 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
driver.quit() #退出
復(fù)制代碼
4. 鼠標(biāo)鍵盤(pán)事件
from selenium import webdriver #引入 Keys 類包
from selenium.webdriver.common.keys import Keys #引入 ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
... #鼠標(biāo)事件 #定位到要操作的元素
right =driver.find_element_by_xpath("xx") #對(duì)定位到的元素執(zhí)行鼠標(biāo)右鍵操作
ActionChains(driver).context_click(right).perform() #對(duì)定位到的元素執(zhí)行鼠標(biāo)雙擊操作
ActionChains(driver).double_click(right).perform() #對(duì)定位到的元素執(zhí)行鼠標(biāo)移動(dòng)到上面的操作
ActionChains(driver).move_to_element(right).perform() #對(duì)定位到的元素執(zhí)行鼠標(biāo)左鍵按下的操作
ActionChains(driver).click_and_hold(right).perform() #定位元素的原位置
element = driver.find_element_by_name("xxx") #定位元素要移動(dòng)到的目標(biāo)位置
target = driver.find_element_by_name("xxx") #執(zhí)行元素的移動(dòng)操作
ActionChains(driver).drag_and_drop(element, target).perform() #鍵盤(pán)事件 #刪除多輸入的一個(gè) 值
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) #輸入空格鍵+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程") #ctrl+x 剪切輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') #其余的鍵盤(pán)操作類似
復(fù)制代碼
5. 等待時(shí)間
#coding=utf-8
from selenium import webdriver #導(dǎo)入 WebDriverWait 包
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC #導(dǎo)入 time 包
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com") #WebDriverWait()方法使用,顯示等待,WebDriverWait(driver,超時(shí)時(shí)長(zhǎng)邪乍,調(diào)用頻率降狠,忽略異常).until(可執(zhí)行方法,超時(shí)返回的信息),這里可以調(diào)用EC來(lái)實(shí)現(xiàn)可執(zhí)行方法
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“kw”).is_displayed()) #until(method, message=’ ’),調(diào)用該方法提供的驅(qū)動(dòng)程序作為一個(gè)參數(shù)庇楞,直到返回值不為 False
element.send_keys("selenium") #添加智能等待喊熟,隱時(shí)等待
driver.implicitly_wait(30)
driver.find_element_by_id("su").click() #添加固定休眠時(shí)間,強(qiáng)制等待
time.sleep(5)
driver.quit()
復(fù)制代碼
6. 組對(duì)象定位及層級(jí)定位姐刁,呃芥牌,忽略
7. 多窗口處理
#coding=utf-8
from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/") #獲得當(dāng)前窗口
nowhandle=driver.current_window_handle #打開(kāi)注冊(cè)新窗口
driver.find_element_by_name("tj_reg").click()
allhandles=driver.window_handles #循環(huán)判斷窗口是否為當(dāng)前窗口
for handle in allhandles: if handle != nowhandle:
? ? ? ? driver.switch_to_window(handle) print 'now register window!'
#切換到郵箱注冊(cè)標(biāo)簽
driver.find_element_by_id("mailRegTab").click()
time.sleep(5)
driver.close() #回到原先的窗口
driver.switch_to_window(nowhandle)
driver.find_element_by_id("kw").send_keys(u"注冊(cè)成功!")
time.sleep(3) #ifrome處理 #這里會(huì)自動(dòng)識(shí)別id聂使,name壁拉,如果沒(méi)有則可以將元素通過(guò)選擇器找到,然后輸入該元素即可
driver.switch_to_frame("f1")
element = driver.find_element_by_id("kw")
driver.switch_to_frame(element)
driver.quit() 
復(fù)制代碼
8. 提示窗口處理
#coding=utf-8
from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/") #點(diǎn)擊打開(kāi)搜索設(shè)置
driver.find_element_by_name("tj_setting").click()
driver.find_element_by_id("SL_1").click() #點(diǎn)擊保存設(shè)置
driver.find_element_by_xpath("http://div[@id='gxszButton']/input").click() #獲取網(wǎng)頁(yè)上的警告信息
alert=driver.switch_to_alert() #接收警告信息
alert.accept() #取消對(duì)話框(如果有的話)
alert.dismiss() #輸入值(如果有的話)
alert.send_keys(“xxx”)
復(fù)制代碼
9. 控制瀏覽器滾動(dòng)條柏靶,這個(gè)運(yùn)用之前提示的jq語(yǔ)句即可實(shí)現(xiàn)
10. cookie處理弃理,主要用途在于處理驗(yàn)證碼問(wèn)題
#coding=utf-8
from selenium import webdriver import time
driver = webdriver.Chrome()
driver.get("http://www.youdao.com") #向 cookie 的 name 和 value 添加會(huì)話信息。
driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbb'}) #遍歷 cookies 中的 name 和 value 信息打印屎蜓,當(dāng)然還有上面添加的信息
for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) ##### 下面可以通過(guò)兩種方式刪除 cookie ##### # 刪除一個(gè)特定的 cookie
driver.delete_cookie("CookieName") # 刪除所有 cookie
driver.delete_all_cookies()
time.sleep(2)
driver.close()
復(fù)制代碼
四痘昌、小結(jié)
如果對(duì)軟件測(cè)試、接口測(cè)試炬转、自動(dòng)化測(cè)試辆苔、性能測(cè)試、面試經(jīng)驗(yàn)交流扼劈。感興趣可以加群:829792258驻啤,群內(nèi)會(huì)有不定期的發(fā)放免費(fèi)的資料鏈接
在熟悉了selenium常見(jiàn)的API基本操作后,這里便可以開(kāi)展實(shí)際測(cè)試用例的設(shè)計(jì)了荐吵,一個(gè)良好的自動(dòng)化測(cè)試用例起碼符合一下五個(gè)條件:
1骑冗、一個(gè)腳本是一個(gè)完整的場(chǎng)景,從用戶登陸操作到用戶退出系統(tǒng)關(guān)閉瀏覽器先煎。
2贼涩、一個(gè)腳本腳本只驗(yàn)證一個(gè)功能點(diǎn),不要試圖用戶登陸系統(tǒng)后把所有的功能都進(jìn)行驗(yàn)證再退出系統(tǒng)
3薯蝎、盡量只做功能中正向邏輯的驗(yàn)證遥倦,不要考慮太多逆向邏輯的驗(yàn)證,逆向邏輯的情況很多良风,驗(yàn)證一方面比較復(fù)雜谊迄,需要編寫(xiě)大量的腳本闷供,另一方面自動(dòng)化腳本本身比較脆弱, 很多非正常的邏輯的驗(yàn)證能力不強(qiáng)统诺。
4歪脏、腳本之間不要產(chǎn)生關(guān)聯(lián)性,也就是說(shuō)編寫(xiě)的每一個(gè)腳本都是獨(dú)立的粮呢,不能依賴或影響其他腳本婿失。
5、如果對(duì)數(shù)據(jù)進(jìn)行了修改啄寡,需要對(duì)數(shù)據(jù)進(jìn)行還原豪硅。 6、在整個(gè)腳本中只對(duì)驗(yàn)證點(diǎn)進(jìn)行驗(yàn)證挺物,不要對(duì)整個(gè)腳本每一步都做驗(yàn)證懒浮。