selenium2基于python自動化測試_第1頁
selenium2基于python自動化測試_第2頁
selenium2基于python自動化測試_第3頁
selenium2基于python自動化測試_第4頁
selenium2基于python自動化測試_第5頁
已閱讀5頁,還剩466頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

selenium2python自動化測試實戰(zhàn)目錄第一章自動化測試基礎(chǔ)第二章pythonwebivr環(huán)境搭建第三章pythonwedrierAP第四章自動化測試模型第五章自動化測試用例設(shè)計第六章引入unittest單元測試框架第七章引入測試報告與結(jié)構(gòu)優(yōu)化第八章自動化測試高級應(yīng)用第九章seleniumgrid2分布式執(zhí)行測試用例第章行為驅(qū)動開發(fā)BDD框架lettuce入門第十it/etcafe管理自動化測試項目附錄第一章自動化測試基礎(chǔ)第一節(jié)軟件測試分類關(guān)于軟件測試領(lǐng)域名詞多現(xiàn)有許多測試新混概念不同的角度可以將軟件測試有不同的分類的方法;所以,這里匯總見件試相名詞,軟測領(lǐng)有概的解。根據(jù)項目流程階段劃分軟件測試圖1.1上圖是一個典型“V”模型軟件開發(fā)流程,那么各項軟件測試工作是在項目開發(fā)流程中循序漸進(jìn)進(jìn)行的。下面將介紹個段試含義。單元測試單元測(或塊測試是對程序中的單個子程序或有立能代碼段進(jìn)測的過 9集成測試集成測試是單元測試的礎(chǔ)將通過單元模塊裝成系統(tǒng)或子系統(tǒng)再進(jìn)行測試重點(diǎn)是檢查塊間接是正。系統(tǒng)測試系統(tǒng)測試是針對整個產(chǎn)品系統(tǒng)進(jìn)行的測試驗證系統(tǒng)是否滿足了需求規(guī)格的定義以及件系統(tǒng)的正確性和性能等是否滿足其規(guī)約所指定的要求驗收測試:驗收測試是部署軟件之前的最一測操。驗收測試的的確軟件準(zhǔn)備就緒向軟件購買都展示該軟件系統(tǒng)滿足其用戶的需求。白盒測試、黑盒測試、灰盒測試白盒測試與黑盒測試主要是據(jù)軟件測試工作中軟件代碼的可見程度進(jìn)行的劃分這也是軟測試領(lǐng)域中最本的概念。圖1.2黑盒測試:黑盒測試,指的是把被測的軟件看作是一個黑盒子我們不去關(guān)心盒子里面的結(jié)構(gòu)是什么樣子的關(guān)心軟件的輸入數(shù)據(jù)和輸出結(jié)果。它只檢查程序呈現(xiàn)給用戶的功能是否按照需求規(guī)格明書的規(guī)定正常使用程序是否能適當(dāng)?shù)亟邮杖霌?jù)產(chǎn)正的出息黑盒測試著眼于程序外部結(jié)不慮內(nèi)部邏輯結(jié)主要針對軟件界和軟件功能進(jìn)測試。白盒測試:白盒測試,指的是把盒子打開,去研究里面的源代碼和程序執(zhí)行結(jié)果 10它是按照程序內(nèi)部的結(jié)構(gòu)測試程序通過測試來檢產(chǎn)品內(nèi)部動作是否按照設(shè)計規(guī)格說明書的規(guī)常進(jìn)行,檢驗程序中的每條通路是否都能按預(yù)定要求正確工作。灰盒測試:灰盒測試介于黑盒測試白盒測試之間??蛇@理灰測試關(guān)注輸出對于輸入的正確同也關(guān)注內(nèi)部表但這種關(guān)注不象白盒樣詳細(xì)、完整,只是通過一些表征性的現(xiàn)象、事件、標(biāo)志來判斷內(nèi)部的運(yùn)行狀態(tài),有時候輸出是正確的,但部實經(jīng)誤這情況非常多如果每次都通過白盒測試來操作效率會很低因此需要采取這樣的一種灰盒試方。功能測試與性能測試從對軟件的不同測試點(diǎn)可以劃分為功能測試與性能測試功能測試功能測試檢查實際的功能是否符合用戶的需求試的大部分工作也是圍繞軟件的功能進(jìn)行設(shè)計件的目的也就是滿足客戶對其功能的需求。如偏離的這個目的任何測試工作都是沒有意義的。功能測試又可以細(xì)分為很多種:邏輯功能測試、界面測試、易用性測試、安裝測試、兼容性測試等。性能測試性能測試是通過自動化的測試工具模擬多種正常值以及異常負(fù)載條件來對系統(tǒng)的各項性能指標(biāo)進(jìn)行測軟件的性能包括很多方面,主要有時間性能和空間性能兩種時間性能主要是指軟件的一個具體的響應(yīng)時間比一個登錄所需要的時間一個交易所要時間等當(dāng)然拋開具體的測試環(huán)境來分析一次事務(wù)響應(yīng)時間是沒有任何意義的需要搭建一個具體且獨(dú)立的測環(huán)境。空間性能:主要指軟件運(yùn)行時所消耗的系統(tǒng)資源,比如硬件資源,CP內(nèi)存,網(wǎng)絡(luò)帶寬消耗等。手工測試與自動化測試從對軟件測試工作的自動化程度以劃分為手工測試與自動化測試。手工測試:手工測試就是由人去一一個的去執(zhí)行測試用例通過鍵盤鼠標(biāo)等輸入一參數(shù)看返回結(jié)果是否符合預(yù)期結(jié)果手工測試并不非專業(yè)術(shù)語工測試通常是指我們在系統(tǒng)測試階段所進(jìn)行功能測試了更明顯的與自動化測試進(jìn)行區(qū)分,所以這里使用了手工測試。 1自動化測試自動化測試是把以人為驅(qū)動的測試行為轉(zhuǎn)化為機(jī)器行的一種過程常在設(shè)計了測試用例并通評審之后,由測試人員根據(jù)測試用例中描述的規(guī)程步步執(zhí)行測試,得到實際結(jié)果與期望結(jié)果的比較此過程中,為了節(jié)省人力、時間或硬件資源,高測試效率,便引入了自動化測試的概念。自動化測試又可分為功能自動化測試與性能自動化測試。我們一般所說的自動化測試就是指功能自動化測試過相關(guān)的測試技術(shù)通過編碼的方式用一段序測一軟的能這樣就可以重復(fù)執(zhí)行程序來進(jìn)行重復(fù)的測試如果一個軟件一小部分發(fā)生改變,我們只要修改一部分動測代碼可重的對整個軟件進(jìn)行功能測試從而大大的提高了測試性能自動化測試,當(dāng)然,除了早期階段,現(xiàn)在的性測試工作都是通過性能測試工具輔助完成的過工具可以模擬成千上萬的用戶向系發(fā)送請求,用來驗證系統(tǒng)的處理能力。冒煙測試、回歸測試、隨機(jī)測試這三種測試現(xiàn)軟功測周期中既算體確測階也是體測方冒煙測試:是指在對一個新版本進(jìn)行系統(tǒng)大規(guī)模的測試之前驗證一下軟件的基本功能是否實現(xiàn)是否具備測性。引入到軟件測試中是測小在規(guī)試個新版本之前先投入較少的人力和時間驗證一軟件的主要功能,如果主要功能都沒有實現(xiàn),則打回開發(fā)組重新開發(fā)。這樣做的好處是可以節(jié)省大量的時間成本和人成本?;貧w測試:回歸測試是指修改了舊代碼后重新進(jìn)行測試以確認(rèn)修改后沒有引入新的錯誤或?qū)е缕渌a產(chǎn)生錯回歸測試一般是在進(jìn)行軟件的第二輪測試開始的,證第一輪中發(fā)現(xiàn)的問題是否得到修復(fù)。當(dāng)然歸也是一個循環(huán)的過程,如果回歸的問題通不過,則需要開發(fā)人員修改后再次進(jìn)行回歸,直到通過為止。隨機(jī)測試:是指測試中的所有輸入據(jù)都是隨機(jī)生成的目的是模擬用戶的真實操發(fā)現(xiàn)一些邊緣性的錯隨測可發(fā)一隱的誤但是也有很多缺點(diǎn)比如測試不系統(tǒng)無法統(tǒng)計代碼覆蓋率和需求覆蓋率,發(fā)現(xiàn)的問題難以重現(xiàn)。一般是放在測試的最后執(zhí)行。其實隨機(jī)測試更專業(yè)的升級版叫探索性 12其他測試探索性測試探性試以是種試維術(shù)它沒有很多實際的測試方法技術(shù)和工具但是卻是所有測試人員都應(yīng)該掌握的一種測思維方式索性強(qiáng)調(diào)測試人員的主觀能動性棄繁雜的測試計劃和測試用例設(shè)計過程,強(qiáng)調(diào)在碰到題時及時改變測試策略。安全測試安全測試是在IT軟件產(chǎn)品的生命周期中,特別是產(chǎn)品開發(fā)基本完成到發(fā)布階段,對產(chǎn)品進(jìn)行檢驗以驗證產(chǎn)品符合安全需求定義和產(chǎn)品質(zhì)量標(biāo)準(zhǔn)的過程。安全測試也在越來越受到企業(yè)的關(guān)注和重視因為于安全性問題造成的后果是不可估量的尤其于互聯(lián)網(wǎng)產(chǎn)品最容易遭各種安全攻擊。第二節(jié)什么樣的項目適合自動化測試雖然你到這本書時已經(jīng)要試項做了一些分析和量但筆者還有必要在這里啰嗦一下不是所有項目有適合實施自動化測試的,以讀者對項目實施自動化過程中發(fā)現(xiàn)困難重重費(fèi)了大量的人力和時間而沒有得到應(yīng)有的收益。1、任務(wù)測試明確,不會頻繁變動2、每日構(gòu)建后的測試驗證3、比較頻繁的回歸測試4、軟件系統(tǒng)界面穩(wěn)定,變動少5、需要在多平臺上運(yùn)行的相同測試案例、組合遍歷型的測試、大量的重復(fù)任務(wù)6、軟件維護(hù)周期長7、項目進(jìn)度壓力不太大8、被測軟件系統(tǒng)開發(fā)比較規(guī)范,能夠保證系統(tǒng)的可測試性9、具備大量的自動化測試平臺10、測試人員具備較強(qiáng)的編程能力當(dāng)然,并非以上10條都具備有情況下才能開展測試工作。這里就需要讀者做綜合的權(quán)衡。在我 13們普遍的經(jīng)驗中,只要滿足三個件就可以對項目開展自動化測試:軟件需求編程不頻繁測試腳本的穩(wěn)定性決定了自動化測試的維護(hù)成本果軟件需求變動過于頻繁測試人員需要據(jù)變動的需求來更新測試用例以及相關(guān)的測試腳本而腳本的維護(hù)本身就是一個代碼開發(fā)的過程要改調(diào)試必要的時候還要修改自動化測試的架如果所花費(fèi)的成本不低于利用其節(jié)省的測試成本,那么自動化試便是失敗的。項目中的某些模塊相對定某些模塊需求變性大我們便可對相穩(wěn)定的模塊進(jìn)行自動化測試,而變動較大的是用手工測試。項目周期由于自動化測試需求的定動化測試框架的計測試腳本的編寫與試均需要相當(dāng)長的時間完成這的過程本身就是一個測試軟件的開發(fā)過程需較的間完如果項目的周期比較短,沒有足夠的時間去支持這樣個過程,那么自動化測試便成為笑談。自動化測試腳可重復(fù)使用自動化測試腳本的重復(fù)使用要從三個方面來考量,一方面所測試的項目之間是否很大的差異性(如C/S系統(tǒng)和B/S系統(tǒng)的差異所選擇測試工具是否適應(yīng)這種差異最后測人是有力發(fā)應(yīng)這種差異的自動測試框架。第三節(jié)自動化測試及工具簡述自動化測試的概念有廣義與狹義之分義上來講所有借助工具來進(jìn)行軟件測試都可以稱為自動化試;狹義上來講,主要指基于UI層的自動化測試;除此之外還有基代碼編寫階段的單元自動化測試,基本集成測試階段的口自動化測試。注意:如果沒有特別說明,本文所說的自動化測試”指基于“UI的功能自動化試目前市面上的自動化測試工具非常多,下面幾款比較常見的自動化測試工具QTPQTP是HPQuicTestProfessionalsoftware的簡稱,是一種企業(yè)級的自動測試工具。提供了強(qiáng)大易用的錄制回放功能。支持B/S與C/S兩種架構(gòu)的軟件測試。是目主流的自動化測試工具。RobotFrameworkRobotFramwok是一款pyton編的功能自動測試框架具備良好的可擴(kuò)展性支持關(guān)鍵字驅(qū)動,可以同時測試多種類型的客戶端或者接口,可以進(jìn)行分布式測試執(zhí)行watir 14Watr全稱是“WebAppicaionTestinginRub。它是一種于Web模式的自動化功能測試工具。wati是一個ruby語言庫,使用ruby語言進(jìn)行腳本開發(fā)。seleniumSelenium也是一個用于Web應(yīng)用程序測試的工具,支持多平臺、瀏覽、多語言去現(xiàn)動化測試。目前在web自動領(lǐng)應(yīng)越來越廣泛。當(dāng)然除了上面所列自化試外根據(jù)不同的應(yīng)用還有很多商業(yè)的開源的以及公司自己開發(fā)自動化測工具。第四節(jié)seleium工具介紹什么是seenium?selenium自動化測試瀏覽器,它主要是用于Web應(yīng)用程序的自動化測試,但肯定不只局限于此,同時支持所有基于web的管任務(wù)自動化。selenium的特開源,免費(fèi)多瀏覽器支持:FireFox、hroe、I、Opera多平臺支持:linu、windows、MAC多語言支持:jav、pytho、ruby、php、C#、JavScript對web頁面有良好的支持簡單(API簡單靈活(用開語驅(qū)支持分布式測試用例執(zhí)行selenium經(jīng)歷了兩個版本,selenium1.0和selenium2.0,selnium也不是簡單一個工具,而是由幾個工具組成,每個工都有其特點(diǎn)和應(yīng)用場景。selenium1.0seleniumIDE seleniumGrid seleniumRC 15ClientLauncher

erverHttpProxy Core圖1.3seleniumIDEseleniumIDE是嵌入到Firefox瀏覽器中的一個插件,實現(xiàn)簡單的瀏覽器操作的錄制與回放功能。那么什么情況用到它呢?快速的創(chuàng)建bug重現(xiàn)腳本在測試人員的測試過程中發(fā)現(xiàn)了bug之可通過IDE將重現(xiàn)的步錄制下來,以幫助開發(fā)人員更容易的重現(xiàn)bu。IDE錄制的腳本可以可以轉(zhuǎn)換成多種語言,從而幫助我們快速的開發(fā)腳本,關(guān)于這個功能后而用到時再詳細(xì)介seleniumGridSelniumGrid是一種自動化的測試輔助工具id通利用現(xiàn)有的算機(jī)基礎(chǔ)設(shè)施能加快Webapp的功能測試用Grid以很方便地同時在多臺機(jī)器上和異構(gòu)環(huán)境中并行運(yùn)行多個測試事例特為: 并行 通過一個主機(jī)統(tǒng)一控制用例在不同環(huán)境、不同瀏覽器下運(yùn)行 靈活添加變動測試機(jī)seleniumRCseleniumRC是selenium家族的核心工具,seleniumRC支持多種不同的語言編寫自動化測試腳本,通過seleiumRC的服務(wù)器作為代理服務(wù)器去問應(yīng)用從而達(dá)到測試的目的。seleniumRC使用分ClintLibraries和seleniumServer,ClientLibraries庫主要主要用于編寫測試腳本,用來控制selniumServr的庫。SeleniumSerer負(fù)責(zé)控制瀏覽器行為,總的來說,SelenimServer主要包括3個部分:Launer、HttpProyCore其中SeleniumCore是被SeleniumSerer嵌入到瀏覽器頁面中的其實SeleniumCore就是一堆JS函數(shù)的集合就是通過這些JS函數(shù)我們才可以實現(xiàn)程序?qū)g覽器進(jìn)操作Laucher用于啟動覽器,把selnumCore加載到瀏覽器頁面當(dāng)中,并把瀏覽器的代理設(shè)置為SeliuServer的HttpProxy。 16selenium2.0搞清了selnium1.0的家族關(guān)系,selenium2.0是把WebDiver加入到了這個家族中;簡單用公式表示為selenium2.0=selenium1.0+WebDriver需要強(qiáng)的是,在selenium2.0中主推的是WebDiver,WebDriver是seleniumRC的替代品因為selenium為了向下兼容性,所以selniumRC并沒有徹底拋棄,如果你使用selenium開發(fā)一個新自動化測試項目,強(qiáng)列推薦使用WeDrier。那么seeniumRC與webdrive要有什么區(qū)別呢?seleniumRC在瀏覽器中運(yùn)行JavScript應(yīng)用使用瀏覽器內(nèi)置的JavScript翻譯器來翻譯和執(zhí)行selenese命令(seenese是selnium命令集合。WebDrivr通過原生瀏覽器支持或者瀏覽器擴(kuò)展直接控制瀏覽器ebDivr針對各個瀏覽器而開發(fā),取代了嵌入到被測Web應(yīng)用中的JavaScript。與瀏覽器的緊密集成支持創(chuàng)建更高級的測試,避免了JavaScrpt安全模型導(dǎo)致的制除了來自瀏覽器商支持Webrivr還利用操作系統(tǒng)級的調(diào)用模擬用戶輸入selenium與WebDriver原先屬于兩個不同的項目,WebDrivr的創(chuàng)建者SimonStewart早在2009年八月的一份郵件中解釋了項目合并的原因。為何把個項目合并?部分原因是WebDriver解決了Seenim存在的缺點(diǎn)(比如,能夠繞過JS沙箱。我們有出色的API,部分原因是Selenium解決了WebDriver存在的問題(例如支持廣泛的瀏覽器部分原因是因為Selnium的主要貢獻(xiàn)者和我覺合項是用提供最優(yōu)秀框架的最佳途徑。第五節(jié)前端技術(shù)介紹由于selnium基于web的自動化測試技術(shù),我們的要操作的對象是頁面,所以有必要對前端的技術(shù)和工具做一個單的介紹。HTMLHTML(HyperTextMarupLanuage)中文為超文本標(biāo)記語言,HTML是網(wǎng)頁的基礎(chǔ),它并不是一種編程語言,而是一種標(biāo)記語言(一套標(biāo)記標(biāo)簽,但我們可以在HTML標(biāo)簽中嵌入各種前端腳本語言,如\hVBScript、JavaScript等。下面是一個簡單的HTML頁面: 17<html><title>標(biāo)題</itle><body><h1正文</h1></body></html><html>與</hml>間的文本描述網(wǎng)頁<title>與</ttle>之間的內(nèi)容顯示在瀏覽器的標(biāo)題欄<body>與</bdy>間的文本是可見的頁面內(nèi)容<h1></h1之間文被顯示為正文,h1為頁面中的一號字體現(xiàn)在我們通過瀏覽器打開任意一個頁面,在頁面上右鍵菜單選擇“查看網(wǎng)頁源代碼,在復(fù)雜的前端代碼中你依然可以找到HTML的身影。當(dāng)然了,HTML還定義了其它許多功能,請參考其它資料進(jìn)行學(xué)習(xí)。JavaScript簡介JavaScrit是一種由\hNtscape公司的\hiveScript發(fā)展而來的前端\h腳本語言(腳本語言是一個種輕量級的語言,是一種解釋性語言(代碼執(zhí)行不需要預(yù)編譯;被設(shè)計用來向HTML頁面添加交互行為,通常被直接嵌入到HTM頁面。如果要在HTML頁面中使用aScript,我們需要使用<script>標(biāo)簽,同時使用type屬性來定義腳本語<tml><od><scrittpe="tet/javascript">ocument.rite("HelloW!);</script></body 18</html>通過<scripttpe="text/javascript">和</scrt>就可以告訴瀏覽器JavaScrit腳本從何處開始,到何處結(jié)。用document.rite()可以向文檔輸出寫內(nèi)容。XML簡介XML是指擴(kuò)展標(biāo)語言,是標(biāo)通用標(biāo)記語言的個子集;與HTML類似,但它并非HTML的替代品,它們?yōu)椴煌哪康亩O(shè)計;HTML被設(shè)計用來顯示數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的外觀。XML被設(shè)計為傳輸和存儲數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的內(nèi)容。下面是一個簡單的XML<xmlersion="1.0"?><ote><to>George</to><from>Joh</from><eading>Reminder</heading><od>Don'tforgettemeetng!od></note><xmlersion="1.0"?>一個應(yīng)該包含XML的聲明,它定義了XML文檔的版本號<ote></note>定義了文檔里第個素也根素。<to></to><frm></from>eaing></heaing><body></bod>為根元素的子元素他們分別包含了發(fā)送者與接收者信息。這個XL文檔僅僅是用標(biāo)簽包裝純粹的信息,我們需要編寫軟件或程序,才能傳送、接收和示出這個文檔。XL允許我們自己定義標(biāo)簽,上例中的標(biāo)簽沒有在任何XML標(biāo)準(zhǔn)中定義過,如<to>和<frm>,這些標(biāo)簽是由我們自己定義的。上面只是簡的介紹了HTMLJavaScript以及XML等前端技術(shù)Web自動化測試就是與前端技術(shù)打交到,所以,了解前端技術(shù)有助于我們順利的進(jìn)行web自動化測試工作,筆者推薦去w3schoo網(wǎng)站進(jìn)一步學(xué)習(xí)和掌握這些技術(shù)。 19第六節(jié)前端工具介紹FireBugFirBug是FireFox瀏覽器下的一套開發(fā)類插件相信很多同學(xué)對這款前端工具并不陌生它集HTML查看和編輯Jaascript控制臺網(wǎng)絡(luò)狀況監(jiān)視器cookie查看于一體是開發(fā)JavaScrptCSSHTML和Ajax的得力助圖1.4我們可以通過他便查頁面上的元素,而據(jù)屬性行位。在前web自動化測試工作中,此工具必可少。安裝方式firefox瀏覽器的菜單欄中選擇tools工具>add-onsManagr添加組件搜索FireBug;對搜索到的插件進(jìn)行安裝,次重啟瀏覽器即可使用。irePathirePath是FireBug插件擴(kuò)展的一個開發(fā)工具,用來編輯、檢查和生成的XPath1.0表達(dá)式、CSS3選擇器以及jQery選擇器??梢钥焖俣鹊膸椭覀兺ㄟ^xPah和CSS定位頁面上元。 20圖1.5當(dāng)通過FirBug的鼠標(biāo)箭頭擇一個頁面元素后ireath輸入框?qū)⒔o出XPath的表達(dá)式快速的幫我們定位注意我們可以點(diǎn)X按切到CS定位方式從而獲得一個元素的CS定位方式。rePath的安裝方式與FireBug類似。chrome和IE的開發(fā)人員工chrome和IE瀏覽器同樣也提供了類似Firug的開發(fā)人員工具,可以幫助我們定位頁面元素。chrome瀏覽器默認(rèn)自帶chrome開發(fā)者工具,瀏覽器右上角的小扳手,在下拉菜單中選擇“工具”--“開發(fā)者工具”即可打開,更為快捷的通過Ctrl+Shift+I或F12打開。圖1.6IE瀏覽器從IE8版開始加入了開發(fā)人員工具使用它也非常方便通過菜單工具--“開發(fā)人員工具或者通過快捷鍵12即可打開值得一提的是它提提供了瀏覽器的兼容模式我們可以選擇瀏覽器模式切換到IE7模9/10同樣提供向下容模式到IE7這將非常方便的幫助我們試IE瀏覽器的兼容性 21圖1.7第七節(jié)自動化測試語言的選擇通過前面的介紹,我們了解到seleniumwebdrier支持多種語言開發(fā),jav、pyth、rub、php、C#、JaaScipt等,那么我們應(yīng)選擇哪一種語言結(jié)合seleniumwebdriver進(jìn)行開發(fā)呢?這里筆者給出一點(diǎn)自己的看法有學(xué)我公的件用種言發(fā)自動化也要選某語其從質(zhì)來使用軟件開發(fā)言自化發(fā)言有何系所以在選擇語言進(jìn)行自動化測試時不要有這方面的顧慮從個人講自動化測試所用到代碼與開發(fā)人員相同自己的編碼能力一般沒開發(fā)人員強(qiáng)會糟鄙視從而也降低了自身的可替代性。選擇與開發(fā)相同的語言當(dāng)然也有有利的一面測試員通過自動化測試的實踐提高了自己的編碼力,也有助于其它測試工作的進(jìn)行,比,協(xié)助開發(fā)人員定位代碼級的bug,協(xié)助開發(fā)人員進(jìn)接口測試本書并有向前面幾本selenium書選用應(yīng)用更為廣泛的javaC#而是選用了pythn主要有以下幾個方考慮。對于編程能比較弱的初者說yton與ruby等語言更容易學(xué)習(xí)和使用通過自動化測試技術(shù)的實踐,我們不僅掌握了自動化測試技術(shù),從而也掌握一門語法簡單且功能強(qiáng)大的腳本語言(本書中對涉及到的python知識都會做詳細(xì)的講解所以沒有python基礎(chǔ)的同學(xué)完全不用擔(dān)心那什么不選ruby而選python呢?從筆者角度來看,pyton語言除了在自動化測試領(lǐng)域有出色的表現(xiàn)外,在系統(tǒng)編絡(luò)編程,web開發(fā),GUI開發(fā),科學(xué)計算,游戲開發(fā)等多個領(lǐng)域應(yīng)用非常廣泛,而且具有非常良好的社區(qū)支持。也就是說習(xí)掌握pyton編程,其實是為你打開了一道更廣闊的大門。rub是個魔法 22言,時常會給你帶來很多驚喜,pyhon的宗旨是使處理問題變得更簡單,而且格式嚴(yán)謹(jǐn),在協(xié)同編程時不容易產(chǎn)生混亂。所以,綜合考慮筆者認(rèn)為pyhon更適合測試菜鳥的養(yǎng)成計劃。那么對于有編程經(jīng)驗的同學(xué),學(xué)習(xí)pyhon對你來說幾乎沒有任何成本,你完全可以在很短的時間內(nèi)學(xué)習(xí)和使用pyhon處理問題,有一個看上去還不錯的一門語言,為什么不去嘗試使用一下呢?當(dāng)然于專一的同學(xué)只愿意選擇自己熟悉的語言而不愿意嘗試使用新語言那么本更多的是傳遞你處理問題的思路,雖然編程語言的語法有差異,但然可以對你的自動化工作提供解決問題的思路。雖然本書中及到pyton的知識都會進(jìn)行講解但為了你能系統(tǒng)全面的使用pyhon語言筆者建議準(zhǔn)備好一本pyton基礎(chǔ)教程在身邊,以便有疑問的地方隨時翻閱學(xué)習(xí)。 23第二章pythonwebdriver環(huán)境搭建有了上一節(jié)的基礎(chǔ)后面我們就開始動手搭建自己的自動化測試環(huán)境也是我們實施自動化測試的準(zhǔn)備工作,本書選用python語言,如果讀者選用的其它語言請參考其它資料進(jìn)行環(huán)境的搭第一節(jié)環(huán)境搭建準(zhǔn)備工具如下下載pythn【python開發(fā)環(huán)境】\hhttp://python.og/getit/下載setuptols【pyton的基礎(chǔ)包工具】\hhttp://pypi.ython.rg/ppi/setptols下載pip【pyton的安裝包管理工具】\hhttps://pypi.pyhon.rg/pyp/pip要想使用pyton語言開發(fā)首先需要pyhon開發(fā)環(huán)境需要說的是python目前最新版本.7.x和3.3.x(簡稱python2和python3;python3并非完全的向下兼容python2,語法上也有較大的差異。python3在性能上更加優(yōu)秀,但由于python2多年的發(fā)展,大量的類庫、框架是基于pyton2,所以,目前兩個版本都在維護(hù)更新。筆者推薦新手從pyhon2開始學(xué)習(xí)python,因為有豐富的資料、類庫和框架給我們學(xué)習(xí)和使用。當(dāng)然,隨著時間的推移,python3才是pyton發(fā)展的未來。setuptools是pyton的基礎(chǔ)包工具,可以幫助我們輕松的下載,構(gòu)建,安裝,升級,卸載python的軟件包pip是python軟件包的安裝和管理工具有這工具我們只需要一個命令就可以輕松的pyton的 24任意類庫windows環(huán)境安裝第一步、安裝python的開發(fā)環(huán)境包,選擇需要安裝路徑進(jìn)行安裝,筆者下載的是目前最新的python2.7.5版本,安裝目錄為:C:\Python27第二步、安裝setuptools通過前面提供的setptols的連接,拖動頁面到底部找到,\hsetuptools-1.3..targz文件(版本隨著時間版本會有更新,對文件進(jìn)行解壓,找到ez_nstall.py文件,進(jìn)入windows命令提示(開始--運(yùn)行--cmd命令,回車)下執(zhí)行ez_instll.y:C:\setuptools-1.3>pythonez_install.py如果提示python不是內(nèi)部或外部命令!別急,去添加一下python的環(huán)境變量吧!桌面“我的電腦”右鍵菜單-->屬性-->高級->環(huán)境變量--系統(tǒng)變量中的Path為:變量名:PATH變量值:;C:\Python27第三步、安裝pip,通過上面提供的鏈接下載pip-.41.tr.g(版本隨著時間版本會有更新默認(rèn)解壓在了C:\ip-1.4.1目錄下打開命令提示(開始--運(yùn)行-cmd命令回車進(jìn)入C:\pip14.1目錄下輸C:\pip-1.4.1pythonsetup.pyinstall再切換到C:\Pthon27Scripts目錄下輸C:\Python27\Scripts>easy_installpip第四步、安裝selenium,如果是電腦處于聯(lián)網(wǎng)狀態(tài)的話,可以直接在C:\Python27\Scripts下輸入命令安裝C:\Python27\Scripts>pipinstall-Uselenium如果沒聯(lián)網(wǎng),可以通過下載安裝:selnium下載地址:\hpyp/selnium下載selenium2.33.0目前的最新版,并解壓把整個目錄放到C:\Python27Libsit-pakags目錄linux環(huán)境安裝下面以ununtu為例進(jìn)行安其它版本的liux可能會有所差異在絕大多數(shù)linux和UNIX系統(tǒng)安裝中(包括MacOSX),Python的解釋器就已經(jīng)存在了。我們需要做的就是打開終端,輸入python命 25令進(jìn)行驗證,這里不再介紹pyth安第一步、安裝:setuptoolsroot@fnngj-H24X~#ap-getintallpyhonsetptols第二步、安裝pip下載pip安裝文件,切換到文件錄,對其進(jìn)行解壓:root@fnngj-H24X/home/user/python#tar-zvfpip-1.4.1.ta.gz切換到解目錄:root@fnngj-H24X/home/user/python#cdpip1.41/進(jìn)行pip的安裝root@fngj-H24X/home/user/python/pip-1.4.1#pythonsetup.pyinstall第三步、安裝seleniumroot@fnngj-H24X:/hoe/user/pytn/pip-1.4.pipinstall-Uselenium第二節(jié)使用IDLE來編寫pthon相信上面的配置過程已經(jīng)讓不少新手感到非常繁瑣事開頭難我們有必要花一點(diǎn)時間在環(huán)境的置上,因為環(huán)境的搭建是后實施自動化測試的前提。如果筆者是第一次接觸python語言且編程能力薄弱,那么筆者建議使用python自帶的IDLE來編寫腳本。為了更好的通過IDLE幫助們編寫pyton+webdiver腳本,我們需要先了解一下IDLE。IDLE提供了一個功能完備的代碼編輯器,允許你在這個編輯器中編寫代碼,另外還有一個pythonshell(pytn的交互模式可以在其中試驗運(yùn)行代碼。第一次啟動IDLE時,會顯示“三個大于號”提示符(>>>,可以在這里輸入代碼。pythonshell得到你的代碼語句后會立即執(zhí)行,并在屏幕上顯示生成的結(jié)果。如圖2.1 26圖2.1有效地使用IDLEIDLE提供了大量的特性,不過只需了解其中一小部分就能很好地使用IDLE。TAB完成:先鍵入一些代碼,然后按下鍵。IDLE會提供一些建議,幫助你完成這個語句。圖2.2回退代碼語句按下Al+P可回退到IDE中之前輸入的代碼語句或按下Alt+N可以移至下一個代碼語句。如圖2.x按Alt+P回退到上一次編輯的代碼。 27圖2.3第三節(jié)第一個自動化腳本有了上面的環(huán)境,你一定很迫切想要編寫并運(yùn)行一個自動化腳本,下面就來體驗一下python與wegdrivr結(jié)合之后編寫的腳本是多么簡潔:如果是windows用戶,在開始菜單找到python目錄,打開IDLE(pythonGUI)程序,啟動的是一個交互模式??梢暂斎耄篺romseleniumimprtwebdriver上面的命令為導(dǎo)入selenium的相關(guān)包,如果回車后沒有報錯表示我們的selenium安裝是成功的。圖2.4下面通選擇菜單欄FileNewnows或通過快捷鍵Ctrl+N打開新的窗口。輸以下代碼:#coding=utf-8fromseleniumimportwebdriverbrowser=webdriver.Firefox() 28 博客園蟲師browser.get("")browser.find_element_by_id("kw").send_keys("selenium")browser.find_element_by_id("su").click()browser.quit()輸入完成后命令為baidu.py存按5快捷運(yùn)行腳本看到腳本啟動Firefox瀏覽器進(jìn)入百度頁,輸入“selenium”點(diǎn)擊搜索按鈕,最后關(guān)閉瀏覽器的過程這里默認(rèn)讀已安了Frefox瀏覽器)我們后面的腳本也將會在這個編輯器下完成,在你還沒找到更好的編輯器之前代碼解析:#codng=ut-8為了防止亂碼問題,以及方便的在程序中添加中文注釋,編統(tǒng)一成UTfromseleniumimprtwebdriver導(dǎo)入selenium的webdriv包只有導(dǎo)入webdrier包我們才能使用webriverAPI進(jìn)行自動腳本的開import所引入包,更專業(yè)的叫法為:模組(modules)browserwebrivr.Frefx()需要將控制的webdriver的Firefox賦值給browse;獲得了瀏覽器對象才可以啟動瀏覽器,打開網(wǎng)址,操作頁面嚴(yán)肅,F(xiàn)irefox是默認(rèn)已經(jīng)在seleniumwebdrive包里了,所以可以直接調(diào)用。當(dāng)然也可以調(diào)用e或Chrome,不過要先安相關(guān)的瀏覽器驅(qū)動才行。browser.get("")獲得瀏覽器對象后,通過ge法可向覽器發(fā)送網(wǎng)址browser.findelemen_byid("w").sed_kes("selenium")關(guān)于頁面元素的定位后面將會詳細(xì)的介紹,這里通過id=kw定位到百度的輸入框,并通過鍵盤方法send_kes()向輸入框里輸入selenium。多自然語言呀!browser.find_elmen_by_id(su".click()這一步通過id=u定位的搜索按鈕,并向按鈕發(fā)送單擊事件(click()browser.quit()退出并關(guān)閉窗口的每一個相關(guān)的驅(qū)動程序。第四節(jié)安裝瀏覽器驅(qū)動 29博客園蟲師WebDriver支持Firefox(\hFirefoxDriver)IE\hIntrneExporeDrier)Opera\hOpeaDrver)Chrome(\hChrmeDive)。對Saari的支持由于技術(shù)限制在本版本中未包含,但是可以使用\hSeleneseCommandxecutor模擬。它還支持Andoid(\hAnroiDrie)和iPhne(\hIPhoneDriver的移動應(yīng)用測試。它還包括一個基于HtlUnt的無界面實現(xiàn),稱為\hHtmUnitDrive。各個瀏覽器驅(qū)下載地址:\h/p/selenium/downloads/list安裝chrme瀏覽器驅(qū)動,下載\hChromeDriver_win32.zip(根據(jù)自己系統(tǒng)下載不同的版本驅(qū)動),解壓得到chroedrive.exe文件放到環(huán)境變量Path所設(shè)置的目下如果前面我已將(C:\ython27添加到了環(huán)境變量Path所設(shè)置的目錄,可以將chroedrive.exe放到C:\Pyton2\目錄下。安裝IE瀏覽器驅(qū)動下載IEDriverServer_in32x.xx.zi,將解壓得到IEDriveServer.xe同樣放置到C:Pythn27\目錄下。liunx系統(tǒng)下,同樣下載系統(tǒng)對應(yīng)的瀏覽器驅(qū)動,并將驅(qū)動放置到環(huán)境變量Path所設(shè)置的目錄下,這里不再詳細(xì)介紹。安裝完成后可以用IE和chrme來替換firex運(yùn)行上面的例子。browser=webdriver.Firefox()替換browser=webdriver.Ie()browser=webdriver.Chrome()如果程序能調(diào)用相應(yīng)的瀏覽器運(yùn)行,說明我們的瀏覽器驅(qū)動安裝成功OperaDriver是WebDriver廠商OperaSoftware和志愿者開發(fā)了對于Opera的WebDriver實現(xiàn)安裝方式與IE、chome有所不同;請參考其它文檔進(jìn)行安裝。 30第三章pythonwebdriverAPI這一章將詳?shù)闹v解基于python的webdiverAPI,筆者更愿意讀者自已去查詢webdriverAPI中各種操作方法的使用,為了保持本書由淺入深的完整性,本章將用相當(dāng)有篇幅介紹基于python語言的webdriver對種操作的使用。通過本章的學(xué)習(xí),我們掌握web頁面上各種元素、彈窗的定位與操作,以及瀏覽器cokie的操作,JavaScript的調(diào)用等問題。第一節(jié)、瀏覽器的操作3.1.1、瀏覽器最大化在統(tǒng)一的瀏覽器大小下運(yùn)行用例以較易跟一些基于圖像比對的工具進(jìn)行結(jié)合提升測試靈活性及普遍適用性。比如可以跟siuli合,使用sikuli操作flash。#coding=utf-8fromseleniumimportwebdriverdriver=webdriver.Firefox()driver.get("")print"瀏覽最化"driver.maximize_window()driver.quit()

#瀏覽器最大化顯示313.1.2、設(shè)置瀏覽器寬、高在不同的瀏覽器大小下問測試站點(diǎn)測試頁截并存然后觀察使用圖像比對工具對被測頁面的前端樣式進(jìn)行評測。比如可以將瀏覽器設(shè)置成移動端大小(320x480),然后訪問移動站點(diǎn),對其樣式進(jìn)行評#coding=utf-8fromseleniumimportwebdriverdriver=webdriver.Firefox()driver.get("")#參數(shù)字像點(diǎn)print"設(shè)置瀏覽器寬480高800顯示"driver.set_window_size(480,800)driver.quit()3.1.3、控制瀏覽器前進(jìn)、后退瀏覽器上有一個后退前按鈕對于瀏覽網(wǎng)頁的人是比較便的對于web自動化測試來說是一個比較難模擬的操webdrver提了back)和forwad()方使現(xiàn)這操作得非簡。#coding=utf-8fromseleniumimportwebdriverimporttimedriver=webdriver.Firefox()#訪問度first_url=''print"nowaccess%s"%(first_url) 32driver.get(first_url)#訪問聞second_url=''print"nowaccess%s"%(second_url)driver.get(second_url)#返回(后退)到百度首頁print"backto%s"%first_url)driver.back()#前進(jìn)新print"forwardto%s"%(second_url)driver.forward()driver.quit()為了使腳本的執(zhí)行程看得更清晰,在每一步操作上都加了prit來打印當(dāng)前的URL地址。運(yùn)行結(jié)果如下>>>=============================RESTART===============================>>>nowaccessnowaccesshtp:/new.badu.ombacktoforwardto實際測試中這兩個功能平時很被用筆者所能想到的場景就是幾個頁面來回跳轉(zhuǎn)但又不想用geturl的情況下。python基礎(chǔ)知識補(bǔ)充:下面打開pytonshell做以下練習(xí):>>>name='huhu' 33>>>age=26>>>print"mynameis%s"%namemynameishuhu>>>print"myageis%d"%agemyageis26>>>print"mynameis%d"%nameTraceback(mostrecentcalllast):File"<pyshel#9>",linein<modle>print"mynameis%d"%nameTypeError:%dformat:anumberisrequired,notstr>>>print"mynameis%s,ageis%d"%(name,age)mynameishuhu,ageis26在pyhon2中使用prnt語句進(jìn)行打印輸出如果是字符信息的話需要對打印的信息加單引號’)或雙引號“,它本質(zhì)上沒有任何區(qū)別,不過使用引號時須要成對出現(xiàn)。上面的例子中我們定義一個字符串變量name和一個數(shù)據(jù)變量age,要想在print打印字符串中引用這兩個變量就要用到“格式化字符串”的東西,在prit打印字符串中指定變量類型“%s”表示輸出的類型為字符串“%d”表示輸出類型為整型數(shù)字。name為字符串類型我們用%d來指定輸出類型就會報錯如果我們不確定變量類型的話可以使用%r,它的含義是“管什么都打印出來。第二節(jié)簡單對象的定位對(元素的定位和操作是自動化測的核心部分其中操作又是建立在位的基礎(chǔ)上的因此元素定位就顯得非常重本書中用到的對象與元素為一個事物)一個對象就像是一個人,他會有各種的特征(屬性,如比我們可以通過一個人的身份證號、姓名或者他的址找這個人么個素有似屬性我們可以通過這種唯一區(qū)別于其它元素的屬性來定位這個元素然除了要操作元素時需要定位元素外時候我們只是為了獲得元素的屬(clas屬性,name屬性、text或數(shù)量也需要定位元素。webdrivr提供了一系列的素定位方法,常用的以幾種 34 博客園蟲師id name clasname tagname linktext partiallinktext xpat cssselector分別對應(yīng)pytonwebdriver中的方法為:find_element_byid()find_element_bynam()find_element_byclas_name()find_elementby_tagnamefind_element_bylin_text()find_element_byparial_ink_tet()find_element_byxpat()find_elementby_cssseletor()3.2.1id和ame定位id和name是我們最常用的定位方式因大數(shù)元素都有這兩個屬而且在對控件的id和name命名時一般使其有意義也會取不同的名字。通過這兩個屬性使我們找一個頁面上的屬性變得相當(dāng)容易<inputid="gs_htif0"class="gsfi"aria-hidden="true"dir="ltr"><inputtype="submit"name="btnK"jsaction="sf.chk"value="Google搜索"><inputtype="submit"name="btnI"jsaction="sf.lck"value="手氣">通過元素中所帶的id和name屬性對元素進(jìn)行定位:id=”gs_htif0”find_eementby_id"gs_htif0")name=btnK”find_elemen_by_name("btn") 35 博客園蟲師name=btnI”find_elemen_by_name("btn")3.2.2tagame和classname定位不是所有的前端發(fā)員都喜歡為每一個元添加id和name兩個屬性但除此之外你一定發(fā)現(xiàn)了一個元素不單單只有id和nam,它還有class屬性而每個元素都有標(biāo)簽。<divid="searchform"class="jhp_big"style="margin-top:-2px"><formid="tsf"osubmit="returnname="f"mthod="GET"action="/search"><inputid="kw"class="s_ipt"type="text"name="wd"autocomplete="off">通過元素中帶的clss屬性對元素進(jìn)定位:class=”jhp_big”find_elementby_clas_nme("jhp_big"class=”s_ipt”find_element_byclas_nae("s_ipt")通過tag標(biāo)簽名對對元素進(jìn)行定位:<divfind_element_bytagname("div")<form>find_element_by_ag_name"form<input>find_element_by_tagname"input")tagname定位應(yīng)該是所有定位方式中最不靠譜的一種了,因為在一個頁面中具有相同tagname的元素極其容易出現(xiàn)。 363.2.3linktext與artialliktext定位有時候需要操作的素是一個文字鏈接那么我們可以通過linktet或partiallinktet進(jìn)行元素定位。<ahref=""name="tj_news">新聞<a><ahref=""name="tj_tieba">貼吧/a><ahref=""name="tj_zhidao">一個長文字連接a>通過linktext定位元素:find_elementby_link_text("新聞")find_elementby_link_text("貼吧")fin_element_bylink_text("一個很長的文字連接")通patialliktext也可以定位到上面幾個元素:find_elementby_parial_ink_tet("新")find_elementby_parial_ink_tet("吧")fin_elmen_by_artiallin_tet("一個很長的")當(dāng)個字接長我可以只取其中的一部分只取部可唯標(biāo)元一般一個頁面上不會出現(xiàn)相同的文件鏈接,通過文字鏈接來定位素是種單效定方下面介紹xpath與CSS定位相比上面介紹的方式來說比較難理解,但他們的靈活性與定位能力比上面的方式強(qiáng)大。3.2.4XPath定位XPath是一種在XML文檔中定位元素的語言。因為HTML可以看做XML的一種實現(xiàn),所以selnium用戶可是使用這種強(qiáng)大語言在web應(yīng)用中定位元素。XPath擴(kuò)展了上面id和name定位方式,提供了很多種可能性,比如定位頁面上的第三個多選框。<htmlclass="w3c"><body><divclass="wrap"><divid="hd"name="q"> 37 博客園蟲師<formtarget="_self"action="/s"><spanid="input-container"><inputd="input"pe="text"-webkit-speech=""utocomplete="off"suggestwidth="501px">我們看到的是一個有層級關(guān)系頁面,下面我看看如果用xpah來定最一元。用絕對路徑定位:find_element_by_xpath("/htm/bodydiv[2/formspan/npu")當(dāng)我們所要定位的元素難找到合適的方式時可通種對徑方式位點(diǎn)是當(dāng)元素在很多級目錄下時,我們不得不要寫很長路徑,而且這種方式難以閱讀和維護(hù)。相對路徑定位:fin_elmen_byxpah("http://inut[@i=input]")#通過自身的id屬性定fin_elmen_byxpah("http://spn[@id’inpt-conaine’]/inut)通過上一級目錄的id屬性定位find_element_by_xpath("http://di[@id’h’]/for/span/inpu")#通過上三級目錄的id屬性定位find_element_by_xpath("http://di[@namq’]/for/spaninpu")#通過上三級目錄的name屬性定位通過上面的子我們可以看到XPah的定位方式非常靈活和強(qiáng)大而且XPa可以做布爾邏輯運(yùn)算,例如://dv[@i’h’or@name’q’]當(dāng)然它的缺陷也非常明顯1性差定元的能比其它大多數(shù)方式差2不夠健壯a(bǔ)h會隨著頁面元素布局的改變而改變;3.兼容性不好,在不同的瀏覽器下對XPah的實現(xiàn)是不一樣的。通過我第一章中介紹的firebug的HTL和firePah可以非常方便的通過XPath方式對頁面元素進(jìn)行定打開firefox瀏覽器的firebug插件,點(diǎn)擊插件左上角的鼠標(biāo)箭頭,再點(diǎn)擊頁面上的元素,firebg插件的HTL標(biāo)簽頁將看到頁面代碼鼠標(biāo)移動到元素的標(biāo)簽(如圖圖3.1imut>將顯示當(dāng)前元素的絕對路徑/html/body/div[5]/div/div/from/input圖3.1 38博客園蟲師或者直接在元素上右擊彈出快捷菜單,選擇CopyXath,將當(dāng)前元素的XPath路徑拷貝要腳本本中(如圖3.。圖3.2firePath工具的使用就更加方便和快捷了,選中元素后,直接在XPath的輸入框中顯示當(dāng)前元素的XPath的定位信息(如圖3.圖3.3 393.2.5CSS定位CSS(CascadinStyleSheets)是一種語言,它被用來描述HTML和XML文檔的表現(xiàn)。CSS使用選擇器來為頁面素綁定屬性。這些選擇器可以被selenium用作另外的定位策。CSS可以比較靈活選擇控件的任意屬性,一般情況下定位速度要比XPath快,但對于初學(xué)者來說比較難以學(xué)習(xí)使用,下面我們就詳細(xì)的介紹CSS的語與用。CSS選擇器的見法:*E.info#footerE,FEEFEFEFE[att='val]E[att^='val]E[att$=val]E[att*=val]E[att1=v1'][att2*='v2]Econtains(xxxx)Enot(s)

通用元素選擇器,配任何元素標(biāo)簽選擇器,匹配所有使用E簽的元素class選擇器,匹配所有class屬性中包含info的元素id選擇器,匹配所有id屬性等于footer的元素多素?fù)衿魍ヅ渌蠩元素或F元素E和F之間用逗號分后元選器匹配所有屬于E元素后的F元素E和F之間用空格子元素選擇器,匹配所有E元素的子元素F毗鄰元素選擇器,匹配緊隨E元素之后的同級元素F(只匹配第一同級元素選擇器,匹配所有在E元素之后的同級F屬性att的值為al的E元素(區(qū)分大小寫屬性att的值以al開頭的E元素(區(qū)分大小寫屬性att的值以al結(jié)尾的E元素(區(qū)分大小寫屬性att的值包含al的E(區(qū)分大小寫)屬性att1的值為v1,att2的值包含2(區(qū)分大小寫)內(nèi)容中包含xxx的E元素匹配不符合當(dāng)前選擇器的任何元素例如下面一段代碼:<divclass="formdiv"><formname="fnfn><inputnae="username"tpe="text"></input><inputnae="password"tpe="text"></input><inputnae="continue"tpe="button"></input><inputnae="cancel"tpe="button"></input><inputalue="SYS123456"name="vid"tpe="tet"><inputalue="ks10cf6d6"nae="cid"tpe="text"></form><divclass="subdi"><ulid=recordlist"><p>Heading</p><li>Cat</li><li>Dog</li><li>Car</li 40 博客園蟲師<li>Goat</li></ul></div></div>通過CSS語法進(jìn)行匹配的實例:locatorcss=divcss=didivcss=#recordlistcss=ul#recordlistcss=didivpcss=didiv>ulpcss=form+divcss=p+licss=p~licss=form>input[name=username]css=input[name$=id][alue^=SYS]css=input:not([name$=id][value^=SY])css=li:contains('Goa)css=li:not(contains('a'))

匹配<divclass="formdiv"><ulid="recordlis"><p>Heading</p><divclass="subdi">二者定位的都是<li>Cat</li>但是storeCssCount的時,前者得到1,后者得到4<inputnae="username"><inputalue="SYS123456"name="vid"type="hidden"<inputnae="username"tpe="text"></input><li>Goat</li><li>Cat</li>css中的結(jié)性定位結(jié)構(gòu)性定位就是根據(jù)元素的父子、同級中位置來定位,css3標(biāo)準(zhǔn)中有定義一些結(jié)構(gòu)性定位偽類如nth-of-ype,nth-child,但使起來語法很不好解這里就不做介紹。Selenium中則是采用了來自Sizzle的css3定位展,它的語更加靈活易。SizzleCss結(jié)構(gòu)性定位語法:Enth(n)Eeq(n)EfirstElastEeven

在其父元素中的E子元素集合中排在第n+1個的E(第一個n=0)在其父元素中的E子元素集合中排在第1個的E在其父元素中的E子元素集合中排在最后1個的E在其父元素中的E子元素集合中排在偶數(shù)位的E元素(0,2,4…)41EoddElt(n)Et(n)Eonl-childEempty

在其父元素中的E子元素集合中排在奇數(shù)的E(1,3,5…)在其父元素中的E子元素集合中排在n位之前的E(n=2,則匹配0,1)在其父元素中的E子元素集合中排在n之后的E(n=2在匹配3,4)父元素的唯一一個子元素且標(biāo)簽為E不包含任何子元素的E元素,注意,文本節(jié)點(diǎn)也被看作子元素例如下面一段代碼:<divclass="subdi"><ulid=recordlist"><p>Heading</p><li>Cat</li><li>Dog</li><li>Car</li<li>Goat</li></ul></div>匹配示例locatorcss=ul>linth(0)css=ul>:nth(0)css=ul>:nth(0)css=ul>lifrstcss=ul>:frstcss=ul>:lastcss=ul>lilastcss=ul>lievencss=ul>lioddcss=ul>:eencss=ul>p:oddcss=ul>lilt(2)css=ul>lit(2)css=ul>lionlchildcss=ul>:onl-childcss=ul>:only-childcss=didiv>:onl-child

<li>Cat</li><p>Heading</p><li>Cat</li><p>Heading</p><li>Goat</li>Cat,CarDo,Goat<p>Heading</p>[error]notfound<li>Cat</li><li>Goat</li>[error]notfound(ul沒有only-child)<ulid="recordlis">……</ul>SizzleCss提供一些直接選取form表單元素偽類 42 博客園蟲師:input:Findsallinputelements(includestetaras,selcts,andbuton).:text,:ceckox,:fie,:password,:submit,:imge,:reet,:button:Findtheinputelementwiththespecifiedinuttype(:bttonalsofindbutonelements).下面是一些XPH和CSS的類似位功能比較(缺乏一定嚴(yán)謹(jǐn)性定位ByidByclassBy定位子元定位后代ByindexBycontent

Xath//div//div[@id='eleid']//div[@class=eleclass]//div[contains(@class,'eleclass)]//div[@title=Movemousehere]//div[@id='eleid]/*//div/h1//div[@id='eleid]//h1//li[6]//a[contains(.,'Issue6)]

CSSdivdi#eleiddieclassdi[title=Movemousehere]di[title^=Move]di[title$=here]di[title*=mouse]di#eleid>*di#eleid>h1divh1li:nth(5)a:contains(Issue4)通過對比,我們可以看到,CSS定位語法比XPath更為簡潔,定位方式更多靈活多樣;不過對CSS理解起來要比XPth較難但不管是從性能還是定位更復(fù)雜元素上CSS優(yōu)于XPah筆者更推薦使用CSS定位頁面元素關(guān)于自動化的位問題自動化測試的元素定位一直是困擾自動化測試新手一個障礙為我們在自動化實施過程中會碰到各式各樣的象元素雖然XPah和CSS可以定位到復(fù)雜且比較難定位的元素但相比較用id和name來說增加了維護(hù)成本和學(xué)習(xí)本相比較來說id/ame的定位方式更直觀和可維護(hù)有新的成員加入的自動化也加人的習(xí)本所以測試人員在施自動化測試時一定要做好溝通規(guī)范前端開發(fā)人對元素添加idname屬性,或者自有修改HTL代碼的權(quán)限。第三節(jié)操作測試對象前講了少識是位對象定位只是第一定之需對個對象進(jìn)行操作鼠標(biāo)點(diǎn)擊呢還是鍵盤輸入,這要取決于我們定位的對象所支持的操作 43博客園蟲師一般來說,所有有趣的操作與頁面交互都將通過WebElement接口,包括上一節(jié)中介紹的對象定位,以及本節(jié)中需要介的常對象操作。webdrivr中比較常用的操作元素的方法有下面幾個:clearsend_keysclicksubit

清除元素的內(nèi)容,果可以在素模按輸入單提交3.3.1、登錄實例下面以快播私有云登錄實例來展示常見元素操作的使用#coding=utf-8fromseleniumimportwebdriverdriver=webdriver.Firefox()driver.get("/login/?referrer=http%3A%2F%2F%2F")driver.find_element_byid("user_name").clear()driver.find_element_by_id("user_name").send_keys("uername"driver.find_element_by_id("user_pwd").clear()driver.find_element_by_id("user_pwd").send_keys("password")driver.find_element_by_id("dl_an_submit").click()#通過sbmit()來提交操作#driver.find_element_by_id("dl_an_submit").submit()driver.quit()clear() 用于除輸入的默認(rèn)內(nèi)容 44博客園蟲師比如登錄框內(nèi)一般默認(rèn)會有“賬號“密碼”等提示信息,如果直接輸入內(nèi)容,和可能會與輸入框的默認(rèn)提示信息拼接,從而造成輸入信息的錯誤;這時cl)變非有。send_keys("xx")用于一輸框輸入xx內(nèi)容python是容易出現(xiàn)編碼問的語有時候我在sed_kys(方法中輸入中文時然后腳本在運(yùn)行時就報編碼錯誤這個時候我們可以在腳本開頭聲明編碼為utf-8然后在中文字符的前面加個小u就解決了表示轉(zhuǎn)成pytonUnice編碼:#coding=utf-sen_kes(u"中文內(nèi)容")需要注意的是utf-8并不是萬能的,如果utf-8不能解決,可以嘗試將編碼聲明為GBK;關(guān)于pythn的編碼問題,請參考pyton相關(guān)書籍。click() 用于單擊一按鈕其實clik(方法不僅僅用于點(diǎn)擊一個按鈕,可以單擊任何可以點(diǎn)擊的素文字/圖片連接,按鈕,下拉按鈕submit() 提交從上面有例子我們可看到可以使用submit()方法來代替clik(對輸入的信息進(jìn)行提交在有些情況下兩個方法可以相互使用;submit()要求提交對象是一個表單,更強(qiáng)調(diào)對信息的提交。click()更強(qiáng)調(diào)事件的獨(dú)立性比如,一個文字鏈接就不能用submt(方法)33.2WebElement接口常用方法WebElement接口了我前面介紹的法外,它還包含了別一些有用的方法。下面,我們舉例幾個比較有用的方法。size返回元素的尺。例:#返回度入的高size=driver.find_element_by_id("kw").sizeprintsizetext獲取元素的文,例:#返回度面部案 45text=driver.find_element_by_id("cp").textprinttextget_attribute(nme)獲得屬性。例:#返回元素的屬性值,可以是id、name、type或元素?fù)碛械钠渌我鈱傩詀ttribute=driver.find_element_by_id("kw").get_attribute('type')printattribute需要說明的是這個方法在定位一組時變得非常有用,后面將有運(yùn)行的實例。is_displayed()設(shè)置該元素是否用可見。例:#返回元素的結(jié)果是否可見,返回結(jié)果為True或Falseresult=driver.find_element_by_id("kw").is_displayed()printresultWeblemnt接口的其它更多方法請參考webdrierAP第四節(jié)鼠標(biāo)事件前面例子中我們已經(jīng)學(xué)習(xí)到可以用click(來模擬鼠標(biāo)的單擊操作,而我們在實際的web產(chǎn)品測試中發(fā)現(xiàn),有關(guān)鼠標(biāo)的操作,不單單只有單擊,有時候還要和到右擊,雙擊,拖動等操作,這些操作包含在ActionChains類中。ActionChains類鼠標(biāo)操作的常用方法:context_click()double_click()drag_and_drop()拖動move_to_eleent()click_and_hold()

鼠標(biāo)懸停在一元素上按下鼠標(biāo)左鍵一個元素上鼠標(biāo)右擊操作 46context_click()右鍵點(diǎn)擊一個元素。圖3.4如圖3.x如一個web應(yīng)用列表文件提了擊彈出快捷單的操作可以通過context_clik()方法模擬鼠標(biāo)右鍵參考代碼如下:#引入ctionChains類frommon.action_chainsimportAtionChains...#定位要擊元素right=driver.find_element_by_xpath("xx")#對定位到的元素執(zhí)行鼠標(biāo)右鍵操作ActionChains(driver).context_click(right).perform()mn.action_chainsimprtActonCains這里需要注意的是,在使用ActinChins類面方法之前,要先將包引入。ActionChains(drver)driver:wedriver實例執(zhí)行用戶操作。ActionChains用于生成用戶的行為;所有的行為都存儲在actioncins對象。通過perform()執(zhí)行存儲的行perform(執(zhí)行所有ActinChins中存儲的行為perfome)同樣也是Actionhais類提供的的方法通常與ActonChains()配合使用。 47除了鼠標(biāo)右擊之外,ActonCains類還提供了其它的比較復(fù)雜的鼠標(biāo)方法。鼠標(biāo)雙擊操作double_click(onelement)雙點(diǎn)擊頁面元素。例如:#引入ctionChains類frommon.action_chainsimportAtionChains...#定位要擊元素double=driver.find_element_by_xpath("xxx"#對定位到的元素執(zhí)行鼠標(biāo)雙擊操作ActionChains(driver).double_click(double).perform()對于操作系統(tǒng)的操作來說雙擊使用相當(dāng)頻繁但對于web應(yīng)用來雙的戶較筆者唯一想到想的場景是地圖程序(如百度地圖可以通過雙擊鼠標(biāo)放大地圖。鼠標(biāo)拖放操作drag_and_dro(sourc,taret)在源元素上按下鼠標(biāo)左鍵,然后移動到目標(biāo)元素上釋放source:標(biāo)按下的源元素。target:標(biāo)釋放的目元素。鼠標(biāo)拖放操作的參考代碼如下:#引入ctionChains類frommon.action_chainsimportAtionChains...#定位素原置element=driver.find_element_by_name("xxx")#定位元素要移動到的目標(biāo)位置target=driver.find_element_by_name("xxx" 48#執(zhí)行素移操作ActionChains(driver).drag_and_drop(element,target).perform()鼠標(biāo)移動上元素上move_to_elemnt()模擬鼠標(biāo)移動到一個元素上。#引入ctionChains類frommon.action_chainsimportAtionChains...#定位到鼠標(biāo)移動到上面元素above=driver.find_element_by_xpath("xxx")#對定到元素執(zhí)行鼠標(biāo)移動到上面的操作ActionChains(driver).move_to_element(above).perform()按下鼠標(biāo)左鍵clik_and_hod()按住鼠標(biāo)左鍵一個元素。#引入ctionChains類frommon.action_chainsimportAtionChains...#定位到鼠標(biāo)按下左鍵的元素left=driver.find_element_by_xpath("xxx")#對定到元素執(zhí)行鼠標(biāo)左鍵按下的操ActionChains(dr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論