selenium+python面試題目總結(jié)蓄愁,完整度80%双炕,看看你會多少?

很多小伙伴會經(jīng)常私信來問我問題撮抓,有些來不及回答妇斤,實(shí)在抱歉!

本篇有點(diǎn)長丹拯!看到最后站超,給自己一個學(xué)習(xí)的地方!

1. WebDriver原理

webDriver是按照client/server模式設(shè)計(jì)乖酬,client就是我們的測試代碼死相,發(fā)送請求,server就是打開的瀏覽器來打開client發(fā)出的請求并做出響應(yīng)咬像。

具體的工作流程:

·webdriver打開瀏覽器并綁定到指定端口算撮。啟動的瀏覽器作為remote server.

·client通過commandExecuter發(fā)送httpRequest給remote server的的偵聽端口(the webdriver wire control通信協(xié)議)

·Remote server根據(jù)原生的瀏覽器組件來轉(zhuǎn)化為瀏覽器的native調(diào)用。

備注:啟動瀏覽器的時候县昂,使用的是http: hyper test transfer protocol

小編是一名python開發(fā)工程師肮柜,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程,包括從基礎(chǔ)的python腳本到web開發(fā)倒彰、爬蟲审洞、數(shù)據(jù)分析、數(shù)據(jù)可視化待讳、機(jī)器學(xué)習(xí)等芒澜。想要這些資料的可以關(guān)注小編。且我這有個學(xué)習(xí)Python基地创淡,里面有很多學(xué)習(xí)資料痴晦,感興趣的+Q群:895817687

image.png

2. Selenium 特點(diǎn)和組成

Selenium是一個針對web應(yīng)用的開源測試框架,它的測試用例可以用html table或者h(yuǎn)tml 代碼或者編程語言進(jìn)行開發(fā)辩昆,而且他能在幾乎所有的現(xiàn)在的瀏覽器上執(zhí)行阅酪。Selenium可以被部署到windows.linux.mac平臺上,支持的語言有java/python/ruby/.net/perl

特點(diǎn):

1.支持錄制回放
2.多種方式對頁面元素進(jìn)行定位并操作
3.能夠及進(jìn)行debug和設(shè)置斷點(diǎn)
4.能夠把測試腳本保存成html/ruby或者其他語言
5.支持user-extensions.js形式的用戶擴(kuò)展
6.能夠進(jìn)行頁面的斷言

  1. Selenium IDE: 是firefox的插件,可以錄制/回放/測試腳本

  2. Selenium RC:支持程序語言(java/C#/python/ruby)編寫測試用例; selenium和其他測試框架集成术辐,比如java環(huán)境下將selenium和Junit集成砚尽,利用selenium來書寫測試用例,用Junit來實(shí)現(xiàn)測試用例的自動化運(yùn)行辉词。

  3. Selenium Core:是selenium的核心必孤,是有js和html文件組成,它是selenium IDE和selenium RC的核心引擎瑞躺。

  4. Selenium Grid:是selenium的擴(kuò)展敷搪,可以將一批selenium腳本分配到不同的測試機(jī)上同步運(yùn)行。即selenium grid可以在不同的主機(jī)上建立主節(jié)點(diǎn)(hub)和分支節(jié)點(diǎn)(node), 可以使主節(jié)點(diǎn)上的測試用例在不同的分支節(jié)點(diǎn)上運(yùn)行幢哨。對于不同的節(jié)點(diǎn)來說赡勘,可以搭建不同的測試環(huán)境(操作系統(tǒng)/瀏覽器)。


    image.png

3. 如何提高自動化腳本穩(wěn)定性

找原因

1)網(wǎng)速原因捞镰,增加時間等待

2)函數(shù)原因闸与,盡量少使用容易沖突的函數(shù)

3)配置testNG實(shí)現(xiàn)多線程,在編寫測試用例的時候岸售,一定要實(shí)現(xiàn)松耦合践樱,在服務(wù)器允許的情況下盡量設(shè)置多線程運(yùn)行,提高執(zhí)行速度凸丸。


image.png

4. 高質(zhì)量自動化腳本特點(diǎn)

業(yè)務(wù)和代碼分離拷邢,封裝型好。

自動化用例耦合性低屎慢,獨(dú)立性強(qiáng)瞭稼,易于擴(kuò)展維護(hù)

5. 自動化測試缺陷

不穩(wěn)定

可靠性不強(qiáng)

不易維護(hù)

成本與收益

6. 自動化用例的執(zhí)行策略

根據(jù)自動化執(zhí)行的目的來決定

(1)自動化測試用例執(zhí)行用來監(jiān)控,可以設(shè)置用例定時執(zhí)行抛人;

(2)用于回歸測試弛姜,可以把測試用例設(shè)置成觸發(fā)式執(zhí)行脐瑰;

(3)不需要經(jīng)常執(zhí)行的測試用例妖枚,可以由人工執(zhí)行。


image.png

7. 提高selenium腳本的執(zhí)行速度方式

(1)減少操作步驟苍在,減少不必要的操作绝页;

(2)中斷頁面加載,如果頁面加載內(nèi)容過多并且加載的內(nèi)容不影響我們測試寂恬,可以設(shè)置超時時間续誉,中斷頁面加載;

(3)設(shè)置等待時間的時候初肉,可以sleep()固定的時間酷鸦,檢測到元素出現(xiàn)后中斷等待也可以提高速度;

(4) 配置testNG實(shí)現(xiàn)多線程,在編寫測試用例的時候臼隔,一定要實(shí)現(xiàn)松耦合嘹裂,在服務(wù)器允許的情況下盡量設(shè)置多線程運(yùn)行,提高執(zhí)行速度摔握。


image.png

8. 元素定位

1) Id定位

find_element_by_id(‘kw’) //通過id屬性定位

2) Name定位

find_element_by_name(‘wd’) //通過名字進(jìn)行定位寄狼,名字一般不唯一,一般不能 通 過其定位

3) ClassName定位

find_element_by_class_name(‘cn’) //通過類名進(jìn)行定位

4) TagName定位

find_element_by_tag_name(‘input’) //標(biāo)簽氨淌,一般用于一類元素的定位

5) LinkText定位

find_element_by_link_text(‘新聞’) //文本鏈接定位

6) PartialLinkText定位

find_element_by_partial_link_text(‘一個很長的’) //文本鏈接的部分文字

7) 絕對路徑定位

find_element_by_xpath(‘/html/body/div/div[2]/form/span/input[2]’) //絕對地址定位泊愧, 利用層級定位

find_element_by_xpath(‘//input[@name=’n’ and id=’kw’]’) //當(dāng)前頁面某個目錄下 name為n,id為kw的input標(biāo)簽盛正,利用元素屬性進(jìn)行定位

find_element_by_xpath(‘//[@id=kw]’) //其中表示任何屬性删咱,表示id為kw的任何屬 性的元素

find_element_by_xpath(‘//span[@class=’c’]/input’) //層級和屬性結(jié)合進(jìn)行定位

find_element_by_xpath(‘//a[contains(href , ’test’)]’)

8) 相對路徑定位

相對路徑定位一般比絕對路徑定位快。

find_element_by_css_selector(‘.class1’) // 類名定位 .class

find_element_by_css_selector(‘#id’) //id定位 #id

find_element_by_css_selector(‘input’) // 標(biāo)簽名定位

find_element_by_css_selector(‘[autocomplete=off]’) //屬性定位

find_element_by_css_selector(‘span>input’) //標(biāo)簽名為span的input子元素

9) 定位一組元素

Checkboxes = find_elements_by_tag_name(‘checkbox’)

for checkbox in Checkboxes:

checkbox.click() # 通過for循環(huán)全選所有的checkbox

Checkboxes.pop().click() #取消勾選一些checkbox豪筝,pop(-1)=pop()表示一組元素的最后一個腋腮;pop(0) 表示一組元素的第一個,pop(1)表示一組元素的第二個壤蚜,以此類推

10) 父子/兄弟/相鄰節(jié)點(diǎn)的定位

·父->子

Find_element_by_id(‘parent’).find_element_by_tag_name(‘input’) 串聯(lián)尋找

Find_element_by_xpath(‘//input/div[@name=’n’]/span/input[1]’) xpath的層級

Find_element_by_css_selector(‘div#b>input’) css selector的父子關(guān)系

·子->父

Find_element_by_xpath(‘//div[@id=’c’]/../..’) 其中//div[@id=’c’]的父親的父親

·哥哥->弟弟

Find_element_by_xpath(‘//div[@id=’c’’/../div[1]) 找到弟弟后找父親然后找哥哥

Find_element_by_css_selector(‘div#d+div’) 表示id=d的div后面緊跟著的div

Find_element_by_css_selector(‘div#d~div’) 表示id=d的div后面同一級所有div

11) 二次定位

Element1 = driver.find_element_by_id(‘ID1’)

Element2 = Element1.find_element_by_id(‘ID2’)

12) display: none 和hidden的區(qū)別

共同點(diǎn):把網(wǎng)頁中的某個元素隱藏起來即寡;他們在selenium中都是定位不到的。

區(qū)別:display:none不為隱藏的對象保留其物理空間袜刷,該對象在這個頁面上徹底消失聪富,看不到/摸不到;hidden使對象在網(wǎng)頁上不可見著蟹,但該對象在網(wǎng)頁中依然占有空間墩蔓,看不到/摸得到。

備注:isElementPresent()來判斷元素是否存在萧豆。

image.png

9. 常見控件使用

1) link/button:

element.click()

注:ajax不能使用clickAndWait()函數(shù)奸披,因?yàn)閏ickAndWait函數(shù)會在click之后等待頁面重新加載完成,而ajax是部分刷新涮雷,所以這個頁面不能重新加載完成阵面。

2) Textbox:

element.send_keys(‘test’)

3) Upload

Driver.find_element_by_id(‘id’).send_keys(‘D\test.txt’)

4) Mouse Event:

e1=driver.find_element_by_id(‘kw’)

ActionChains(driver).double_click()/.context_click()/.drag_and_drop()/.move_to_eleme nt()/.perform() # 雙擊/右擊/拖動/懸停/執(zhí)行actionChains中的行為

5) Dropdown:

·<Select>標(biāo)簽的下拉菜單

from selenium.webdriver.support.ui import Select

Select(driver.find_element_by_id(‘gender’)).select_by_index(1)

Select(driver.find_element_by_id(‘gender’)).select_by_value(“2”)

Select(driver.find_element_by_id(‘gender’)).select_by_visible_text(“Male”)

·非<Select>標(biāo)簽的下拉菜單

Dropdown1 = driver.find_element_by_id(‘id’) #先定位到dropdown

Dropdown1.find_element_by_id(“l(fā)i2_input_2”) #再定位到dropdown中的值

6) Alert:

driver.switch_to.alert.accept()//接受

driver.switch_to.alert.dismiss() //取消

Message=driver.switch_to.alert.text //獲取彈窗的文本消息

driver.switch_to.alert.send_keys(‘hello’) //輸入值,這個在alert和confirm中不可用

7) Window

Driver.refresh() 刷新

Driver.back() 后退

Driver.forward() 前進(jìn)

Driver.maximize_window() 最大化

Driver.set_window_size(100,200) 設(shè)置窗口大小

Driver.switch_to.window(searchwindow)

8) Frame

Driver.switch_to.frame(ReferenceFrame)

Driver.switch_to.parent_frame() # frame需要一級一級切

Driver.switch_to.default_content()

image.png

11. 等待

1) 顯式等待

等待某個條件成立時繼續(xù)執(zhí)行,每隔一段時間進(jìn)行檢測洪鸭,超出最大時間 則拋出異常(程序每隔X秒看一眼样刷,如果條件成立,執(zhí)行下一步览爵,否則等待置鼻,超出最大 時間,拋出異常)

From selenium.webdriver.common.by import By

From selelnium.webdirver.support.ui import WebDriverWait

From selenium.webdriver.support import expected_conditions as EC

E = WebDriverWait(driver, 5,0.5).until(

EC.presence_of_element_located( (By.ID, ‘kw’) )

)

2) 隱式等待

隱式等待中的時間并非一個固定的等待時間蜓竹,它并不影響腳本的執(zhí)行速度箕母。比如進(jìn)行某元素的定位時储藐,如果元素可以定位就繼續(xù)執(zhí)行,如果目前定位不到就以輪詢的方式持續(xù)判斷該元素是否被定位到嘶是,如果超過規(guī)定的時間還沒定位到就拋出異常邑茄。(甲約乙去吃飯,甲在這里等著俊啼,等了10分鐘乙到達(dá)肺缕,則從10分鐘之后開始下一步,假如等了20分鐘授帕,則20分鐘后開始下一步同木,如果到了最大時間30分鐘還沒到就拋異常)

driver.implicitly_wait(20)

3) 強(qiáng)制等待

From time import sleep

Sleep(2)


image.png

12. 截圖

driver.get_screenshot_as_file('E:\sc.jpg')

13. 線性測試

開發(fā)維護(hù)成本高

14. 模塊化驅(qū)動測試

將重復(fù)的操作獨(dú)立為公共模塊,盡量消除重復(fù)跛十,提高測試用例的可維護(hù)性彤路。

15. 數(shù)據(jù)驅(qū)動測試

數(shù)據(jù)參數(shù)化

1) 讀取txt文件

File= open(‘E:\wtest.txt’, ‘r’)

Lines = File.readlines()

For line in lines:

User = line.split(‘,’)[0]

Passw=line.split(‘,’)[1]

Print(User, Passw)

2) 讀取csv文件

UnicodeDecodeError (未找到解決方案)

3) 讀取xml文件

image.png

16. 關(guān)鍵字驅(qū)動測試

腳本/數(shù)據(jù)/業(yè)務(wù) 分離

17. page object設(shè)計(jì)模式

是將page對象封裝成一個HTML頁面,通過提供的應(yīng)用程序特定的API來操作頁面元素芥映,而不是在html中來搜尋對象洲尊,即提供一個易于編程的接口并隱藏窗口中底層的部件,對界面的交互細(xì)節(jié)進(jìn)行封裝奈偏。

優(yōu)點(diǎn)是:減少了代碼的重復(fù)/提高測試用例的可讀性/提高測試用例的可維護(hù)性(特別是UI頻繁變化的項(xiàng)目)

page object設(shè)置模式中坞嘀,不需要在page里定位的方法中加上斷言(why)

image.png

18. Assert斷言

-斷言的英文是assertion,斷言檢查的英文是assertion checking惊来。

-斷言是指定一個程序必須已經(jīng)存在的狀態(tài)的一個邏輯表達(dá)式丽涩,或者一組程序變量在程序執(zhí)行期間的某個點(diǎn)上必須滿足的條件。

Assert判斷如果出現(xiàn)錯誤裁蚁,則會中斷整個測試矢渊;使用verify進(jìn)行判斷如果出現(xiàn)錯誤仍會繼續(xù)執(zhí)行直到結(jié)束。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枉证,一起剝皮案震驚了整個濱河市矮男,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌室谚,老刑警劉巖毡鉴,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舞萄,居然都是意外死亡眨补,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門倒脓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人含思,你說我怎么就攤上這事崎弃「饰睿” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵饲做,是天一觀的道長线婚。 經(jīng)常有香客問我,道長盆均,這世上最難降的妖魔是什么塞弊? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮泪姨,結(jié)果婚禮上游沿,老公的妹妹穿的比我還像新娘。我一直安慰自己肮砾,他們只是感情好诀黍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仗处,像睡著了一般眯勾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婆誓,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天吃环,我揣著相機(jī)與錄音,去河邊找鬼洋幻。 笑死模叙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鞋屈。 我是一名探鬼主播范咨,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厂庇!你這毒婦竟也來了渠啊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤权旷,失蹤者是張志新(化名)和其女友劉穎替蛉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拄氯,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躲查,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了译柏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镣煮。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鄙麦,靈堂內(nèi)的尸體忽然破棺而出典唇,到底是詐尸還是另有隱情镊折,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布介衔,位于F島的核電站恨胚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炎咖。R本人自食惡果不足惜赃泡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乘盼。 院中可真熱鬧升熊,春花似錦、人聲如沸蹦肴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阴幌。三九已至勺阐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矛双,已是汗流浹背渊抽。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留议忽,地道東北人懒闷。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像栈幸,于是被迫代替她去往敵國和親愤估。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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