Web自動(dòng)化測(cè)試進(jìn)階

一、什么是框架

框架(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)用開(kāi)發(fā)者定制的應(yīng)用骨架。前者是從應(yīng)用方面而后者是從目的方面給出的定義。

框架,其實(shí)就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡(jiǎn)單說(shuō)就是使用別人搭好的舞臺(tái),你來(lái)做表演。

二、為什么使用框架

1.自己從頭實(shí)現(xiàn)太復(fù)雜

2.使用框架能夠更專注于業(yè)務(wù)邏輯,加快開(kāi)發(fā)速度

3.框架的使用能夠處理更多細(xì)節(jié)問(wèn)題

4.使用人數(shù)多,穩(wěn)定性,擴(kuò)展性好

三、selenium工作原理

selenium原理.png

原理:webdriver是按照server–client的經(jīng)典設(shè)計(jì)模式設(shè)計(jì)的。

server端就是remote server,可以是任意的瀏覽器。當(dāng)我們的腳本啟動(dòng)瀏覽器后,該瀏覽器就是remote server,它的職責(zé)就是等待client發(fā)送請(qǐng)求并做出相應(yīng);client端簡(jiǎn)單說(shuō)來(lái)就是我們的測(cè)試代碼,我們測(cè)試代碼中的一些行為,比如打開(kāi)瀏覽器,轉(zhuǎn)跳到特定的url等操作是以http請(qǐng)求的方式發(fā)送給被測(cè)試瀏覽器,也就是remote server;remote server接受請(qǐng)求,并執(zhí)行相應(yīng)操作,并在response中返回執(zhí)行狀態(tài)、返回值等信息。

四、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)

下載谷歌驅(qū)動(dòng)

selenium之 chromedriver與chrome版本映射表

Firefox瀏覽器對(duì)應(yīng)各個(gè)版本驅(qū)動(dòng)下載地址

firefox各個(gè)版本安裝包的下載地址

注意:Firefox35(大于43)版本不需要下載驅(qū)動(dòng)器,大于這個(gè)版本的需要,Chrome需要下載驅(qū)動(dòng)器,下邊分別演示。

五、selenium對(duì)瀏覽器操作

1.庫(kù)的導(dǎo)入

from selenium import webdriver

2.創(chuàng)建瀏覽器對(duì)象

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),所有的位置操作都是相對(duì)于顯示器左上角展開(kāi)的位移操作,單位是像素。

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è)面

案例

from selenium import webdriver

import time

# driver = webdriver.Chrome()? ? #不可以找到,必須導(dǎo)入對(duì)應(yīng)的驅(qū)動(dòng)器

driver = webdriver.Firefox()

url1 = "http://www.baidu.com"

url2 = "https://zhuanlan.zhihu.com/"

# 請(qǐng)求第一個(gè)接口

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

六、selenium獲取斷言信息

1.什么是斷言

斷言是編程術(shù)語(yǔ),表示為一些布爾表達(dá)式,程序員相信在程序中的某個(gè)特定點(diǎn)該表達(dá)式值為真,可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測(cè)試時(shí)啟用斷言而在部署時(shí)禁用斷言。

2.獲取斷言信息的操作

(1)current_url? ? 獲取當(dāng)前訪問(wèn)頁(yè)面url

(2)title? ? ? 獲取當(dāng)前瀏覽器標(biāo)題

(3)page_source? ? ? 獲取網(wǎng)頁(yè)源碼

print(driver.current_url)

print(driver.title)

print(driver.page_source)

(4)get_screenshot_as_png()? ? 保存圖片

data=driver.get_screenshot_as_png()

with open("a.png","wb") as f:

????????f.write(data)

(5)get_screenshot_as_file(file)? ? 直接保存

driver.get_screenshot_as_file("b.png")

七、 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)簽名定位,必須得保證只有一個(gè)這種名字的標(biāo)簽,使用下面這個(gè)搜索

# url = "http://cn.bing.com/"

# driver.get(url)

# ele = driver.find_element_by_tag_name("input")

# ele.send_keys(12306)? ? ?# 輸入數(shù)據(jù)

八、元素的操作

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

案例

1.打開(kāi)百度搜索? ? ? ?

2.搜索關(guān)鍵字 selenium? ? ? ?

3.清空? ? ? ? ? ?

4.搜索python

2.提交操作

element.submit()

九、多標(biāo)簽之間的切換

場(chǎng)景:有的時(shí)候點(diǎn)擊一個(gè)鏈接,新頁(yè)面并非由當(dāng)前頁(yè)面跳轉(zhuǎn)過(guò)去,而是新開(kāi)一個(gè)頁(yè)面打開(kāi),這種情況下,計(jì)算機(jī)需要識(shí)別多標(biāo)簽或窗口的情況。

1.獲取所有窗口的句柄

handles = driver.window_handlers

調(diào)用該方法會(huì)得到一個(gè)列表,在selenium運(yùn)行過(guò)程中的每一個(gè)窗口都有一個(gè)對(duì)應(yīng)的值存放在里面。

2.通過(guò)窗口的句柄進(jìn)入的窗口

driver.switch_to_window(handles[n])

driver.switch_to.window(handles[n])

通過(guò)窗口句柄激活進(jìn)入某一窗口

3.案例: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)錯(cuò),原因是需要句柄

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

十、多表單切換

在網(wǎng)頁(yè)中,表單嵌套是很常見(jiàn)的情況,尤其是在登錄的場(chǎng)景

1.什么是多表單

實(shí)際上就是使用iframe/frame,引用了其他頁(yè)面的鏈接,真正的頁(yè)面數(shù)據(jù)并沒(méi)有出現(xiàn)在當(dāng)前源碼中,但是在瀏覽器中我們看到,簡(jiǎn)單理解可以使頁(yè)面中開(kāi)了一個(gè)窗口顯示另一個(gè)頁(yè)面

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)

3.案例:QQ空間:https://qzone.qq.com/

from selenium import webdriver

#打開(kāi)游覽器

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

#輸入賬號(hào)

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

十一、彈出框操作

1.進(jìn)入到彈出框中

driver.switch_to.alert

2.接收警告

accept()

3.解散警告

dismiss()

發(fā)送文本到警告框

send_keys(data)

用法:driver.switch_to.alert.accept()

4.案例:

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

十二、下拉框

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

十三、鼠標(biāo)和鍵盤操作

手動(dòng)測(cè)試時(shí)鍵盤的操作在selenium頁(yè)有實(shí)現(xiàn),關(guān)于鼠標(biāo)的操作由ActionChains()類來(lái)提供,關(guān)于鍵盤的操作由Key()類來(lái)提供

1.鼠標(biāo)操作

(1)導(dǎo)入動(dòng)作鏈類,動(dòng)作鏈可以儲(chǔ)存鼠標(biāo)的動(dòng)作,并一起執(zhí)行

from selenium.webdriver import ActionChains

ActionChains(driver)

(2)鼠標(biāo)右擊

el=driver.find_element_by_xxx(value)

context_click(el)

對(duì)el執(zhí)行右擊

(3)執(zhí)行ActionChains中儲(chǔ)存的所有動(dòng)作

perform()

(4)常用鼠標(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)懸停

(5)案例

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使用

(1)導(dǎo)入

from selenium.webdriver.common.keys import Keys

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

end_keys(Keys.F1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?鍵盤 F1

send_keys(Keys.F12)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?鍵盤 F12

十四、瀏覽器等待

1.為什么要進(jìn)行等待?

(1)網(wǎng)速慢

(2)網(wǎng)站內(nèi)容過(guò)多

(3)如果不進(jìn)行等待而直接定位元素,可能會(huì)拋出異常

2.selenium中等待的分類:

(1)顯示等待

顯示等待是根據(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è)置時(shí)間內(nèi),默認(rèn)每隔一段時(shí)間檢測(cè)一次當(dāng)前頁(yè)面元素是否存在,如果超過(guò)設(shè)置時(shí)間檢測(cè)不到則拋出異常。

案例

WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located( (By.CLASS_NAME,"g-hu")))

思考:顯示等待與time的區(qū)別?

(2)隱式等待

隱式等待是根據(jù)是件進(jìn)行等待,等待特定時(shí)間

driver.implicitly_wait(n)

n的單位為秒,n為最大值,在這個(gè)最大值內(nèi)只要該界面上的全部元素都加載完成定就結(jié)束沒(méi)有加載出元素就拋出? NosuchException.

注意:優(yōu)先隱式等待,次之顯式等待,最次固定等待

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,373評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,975評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,199評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,414評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,649評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,889評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容