python+selenium做ui自動(dòng)化測(cè)試用法必會(huì)


一篡诽、前言

大家都知道辅愿,基于Web端的測(cè)試的基礎(chǔ)框架是需要Selenium做主要支撐的旭等,這里邊給大家介紹下Web測(cè)試核心之基于 Python 的 Selenium

Selenium 是用于測(cè)試 Web 應(yīng)用程序用戶界面 (UI) 的常用框架句携。它是一款用于運(yùn)行端到端功能測(cè)試的超強(qiáng)工具。您可以使用多個(gè)編程語(yǔ)言編寫(xiě)測(cè)試愉豺,并且 Selenium 能夠在一個(gè)或多個(gè)瀏覽器中執(zhí)行這些測(cè)試篓吁。

二、環(huán)境安裝

安裝 python粒氧,這個(gè)越除。。外盯。忽略摘盆,建議 python3.7。

安裝基于 python 的 selenium 依賴包饱苟,命令:pip install selenium

安裝瀏覽器驅(qū)動(dòng)包孩擂,推薦使用 chrome 瀏覽器的chromedriver.exe,對(duì)應(yīng) chrome 版本一定要對(duì)哦箱熬,不然運(yùn)行不起來(lái)的类垦,安裝在哪?想放哪放哪城须,不過(guò)一般是放在 python 的根目錄下蚤认。下載地址:chromedriver.storage.googleapis.com/index.html

安裝 PyCharm ,這個(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

如果你對(duì)軟件測(cè)試、接口測(cè)試挚冤、自動(dòng)化測(cè)試况增、面試經(jīng)驗(yàn)交流感興趣歡迎加入:軟件測(cè)試技術(shù)群:603401995,群里的免費(fèi)資料都是筆者十多年測(cè)試生涯的精華训挡。還有同行大神一起交流技術(shù)哦澳骤。

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)

以上幾種定位是可以再度升級(jí)温治,可以利用 jQuery 定位一波

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)操作類似

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()

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”)

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è)試、面試經(jīng)驗(yàn)交流感興趣歡迎加入:軟件測(cè)試技術(shù)群:603401995咬最,群里的免費(fèi)資料都是筆者十多年測(cè)試生涯的精華翎嫡。還有同行大神一起交流技術(shù)哦。

在熟悉了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)證橄抹,逆向邏輯的情況很多(例如手 號(hào)輸錯(cuò)有很多種情況)靴迫,驗(yàn)證一方面比較復(fù)雜,需要編寫(xiě)大量的腳本楼誓,另一方面自動(dòng)化腳本本身比較脆弱玉锌, 很多非正常的邏輯的驗(yàn)證能力不強(qiáng)。(我們盡量遵循用戶正常使用原則編寫(xiě)腳本即可)

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)證民效。

最后配合unittest或者testNG單元測(cè)試框架憔维,實(shí)現(xiàn)分層、數(shù)據(jù)驅(qū)動(dòng)畏邢、斷言业扒、截圖、日志等全方位功能舒萎,得心應(yīng)手的開(kāi)展自動(dòng)化測(cè)試工作程储。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子章鲤,更是在濱河造成了極大的恐慌摊灭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件败徊,死亡現(xiàn)場(chǎng)離奇詭異帚呼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)皱蹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)煤杀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沪哺,你說(shuō)我怎么就攤上這事沈自。” “怎么了辜妓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵枯途,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我籍滴,道長(zhǎng)柔袁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任异逐,我火速辦了婚禮,結(jié)果婚禮上插掂,老公的妹妹穿的比我還像新娘灰瞻。我一直安慰自己,他們只是感情好辅甥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布酝润。 她就那樣靜靜地躺著,像睡著了一般璃弄。 火紅的嫁衣襯著肌膚如雪要销。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天夏块,我揣著相機(jī)與錄音疏咐,去河邊找鬼。 笑死脐供,一個(gè)胖子當(dāng)著我的面吹牛浑塞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播政己,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酌壕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卵牍,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤果港,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后糊昙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辛掠,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年溅蛉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了公浪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡船侧,死狀恐怖欠气,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镜撩,我是刑警寧澤预柒,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站袁梗,受9級(jí)特大地震影響宜鸯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遮怜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一淋袖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锯梁,春花似錦即碗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至合敦,卻和暖如春初橘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背充岛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工保檐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸准。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓展东,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親炒俱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盐肃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349