摘要:不同目標(biāo)的自動(dòng)化測(cè)試有不同的測(cè)試工具,但是任何工具都無(wú)不例外的需要編程的過(guò)程,實(shí)現(xiàn)源代碼,也可以稱之為測(cè)試腳本。
寫在最前面:目前自動(dòng)化測(cè)試并不屬于新鮮的事物,或者說(shuō)自動(dòng)化測(cè)試的各種方法論已經(jīng)層出不窮,但是,能夠在項(xiàng)目中持之以恒的實(shí)踐自動(dòng)化測(cè)試的團(tuán)隊(duì),卻依舊不是非常多。有的團(tuán)隊(duì)知道怎么做,做的還不夠好;有的團(tuán)隊(duì)還正在探索和摸索怎么做,甚至還有一些多方面的技術(shù)上和非技術(shù)上的舊系統(tǒng)需要重構(gòu)……
?
本文將會(huì)從使用和實(shí)踐兩個(gè)視角,嘗試對(duì)基于Web UI自動(dòng)化測(cè)試做細(xì)致的分析和解讀,給各位去思考和實(shí)踐做一點(diǎn)引路,以便各團(tuán)隊(duì)能找到更好的方式。
1. 使用測(cè)試工具《論語(yǔ)》有云:工欲善其事,必先利其器。在開始具體的自動(dòng)化測(cè)試之前,我們需要做好更多的準(zhǔn)備,包括以下幾個(gè)方面:
?
認(rèn)識(shí)自動(dòng)化測(cè)試
?
?
準(zhǔn)備自動(dòng)化測(cè)試工具
?
?
使用有效的方式
?
?
針對(duì)具體的測(cè)試對(duì)象
?
接下來(lái)的第一部分內(nèi)容,我們將會(huì)從上述的幾個(gè)方面進(jìn)行探討。
1.1 自動(dòng)化測(cè)試?yán)碚摻榻B?
自動(dòng)化測(cè)試的5W
正如開篇所提到的,自動(dòng)化測(cè)試不再是一個(gè)陌生的話題,而是一個(gè)具體的存在。作為測(cè)試實(shí)踐活動(dòng)的一部分,我們首先分析一下自動(dòng)化測(cè)試的方方面面。
?
WHAT, 什么是自動(dòng)化測(cè)試
G.J.Myers在其經(jīng)典的著作《軟件測(cè)試藝術(shù)》(The Art of Software Testing)一書中,給出了測(cè)試的定義:
?
“程序測(cè)試是為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行的過(guò)程?!?/p>
這個(gè)概念產(chǎn)生于30年前,對(duì)軟件測(cè)試的認(rèn)識(shí)還非常有局限性,當(dāng)然也是因?yàn)槭芷俨奸_發(fā)模型的影響,認(rèn)為軟件測(cè)試是編程之后的一個(gè)階段。只有等待代碼開發(fā)出來(lái)以后,通過(guò)執(zhí)行程序,像用戶那樣操作軟件去發(fā)現(xiàn)問(wèn)題。這里向大家推薦一個(gè)測(cè)試交流圈q裙:1007119548。
?
自動(dòng)化測(cè)試:以人為驅(qū)動(dòng)的測(cè)試行為轉(zhuǎn)化為機(jī)器執(zhí)行的一種過(guò)程
自動(dòng)化測(cè)試,就是把手工進(jìn)行的測(cè)試過(guò)程,轉(zhuǎn)變成機(jī)器自動(dòng)執(zhí)行的測(cè)試過(guò)程。該過(guò)程,依舊是為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行。因此自動(dòng)化測(cè)試的關(guān)鍵在于“自動(dòng)化”三個(gè)字。自動(dòng)化測(cè)試的內(nèi)容,也就相應(yīng)的轉(zhuǎn)變成如何“自動(dòng)化”去實(shí)現(xiàn)原本手工進(jìn)行的測(cè)試的過(guò)程。
?
所有的“自動(dòng)化”,依靠的無(wú)疑都是程序。
通過(guò)程序,可以把手工測(cè)試,轉(zhuǎn)變成自動(dòng)化測(cè)試。
?
?
WHEN, 在什么時(shí)候開展自動(dòng)化測(cè)試
自動(dòng)化測(cè)試的開展,依賴于“程序”。那么程序,其實(shí)就是由“源代碼”構(gòu)建而來(lái)的。那么原則上,只要能做出自動(dòng)化測(cè)試所需要的“程序”的時(shí)候,變可以進(jìn)行自動(dòng)化測(cè)試。但往往,并不是所有的“時(shí)候”都是好的“時(shí)機(jī)”。從這個(gè)W開始,我們將會(huì)加入對(duì)于成本的顧慮,也正是因?yàn)椤俺杀尽钡拇嬖?,才使得下面的討論,變得有意義。
所有的開銷,都是有成本的。構(gòu)建成“程序”的源代碼,也是由工程師寫出來(lái)的。那么需要考慮這個(gè)過(guò)程中的成本?;谶@個(gè)考慮,在能夠比較穩(wěn)定的構(gòu)建“程序”的時(shí)候,不需要花費(fèi)太多開銷在“源代碼”的時(shí)候,就是開展自動(dòng)化測(cè)試的好時(shí)機(jī)。這個(gè)開銷包括編寫和修改源代碼,而源代碼指的是構(gòu)建出用來(lái)做自動(dòng)化測(cè)試的程序的源代碼。
?
?
WHERE, 在什么地方進(jìn)行自動(dòng)化測(cè)試
自動(dòng)化測(cè)試的執(zhí)行,依靠的是機(jī)器。那么自動(dòng)化測(cè)試必將在“機(jī)器”上進(jìn)行。一般來(lái)說(shuō),這個(gè)機(jī)器包括桌面電腦和服務(wù)器。通過(guò)將寫好的源代碼部署在機(jī)器上,構(gòu)建出用來(lái)做自動(dòng)化測(cè)試的"程序",并且運(yùn)行該程序,實(shí)現(xiàn)自動(dòng)化測(cè)試。
?
?
WHICH, 對(duì)什么目標(biāo)進(jìn)行自動(dòng)化測(cè)試
自動(dòng)化測(cè)試的目標(biāo),是被測(cè)試的軟件。拋開人工智能的成分,手工測(cè)試必將在“人工智能”足夠普及和足夠“智能”之前,替代一大部分不需要“人類智能”的手工測(cè)試;以及自動(dòng)化測(cè)試會(huì)做一些手工測(cè)試無(wú)法實(shí)施的,或者手工測(cè)試無(wú)法覆蓋的測(cè)試。
不需要“人類智能”的普通手工測(cè)試
界面的普通操作
通過(guò)固定輸入和固定操作而進(jìn)行的流程化測(cè)試
重復(fù)的普通測(cè)試
?
手工測(cè)試無(wú)法實(shí)施或者覆蓋的
大量的數(shù)據(jù)的輸入
大量的步驟的操作
源代碼基本的測(cè)試
系統(tǒng)模塊間接口的調(diào)用測(cè)試
……
在這里向大家推薦一個(gè)學(xué)習(xí)交流群:672899761
?
?
?
HOW, 如何開展自動(dòng)化測(cè)試
準(zhǔn)備測(cè)試用例
找到合適的自動(dòng)化測(cè)試工具
用準(zhǔn)確的編程形成測(cè)試腳本
在測(cè)試腳本中對(duì)目標(biāo)進(jìn)行“檢查”,即做斷言
記錄測(cè)試日志,生成測(cè)試結(jié)果
?
?
和所有的其他測(cè)試一樣,自動(dòng)化測(cè)試的流程也是由“用例”執(zhí)行和“缺陷”驗(yàn)證組成。差別是需要找到合適的“工具”來(lái)替代“人手”。不同目標(biāo)的自動(dòng)化測(cè)試有不同的測(cè)試工具,但是任何工具都無(wú)不例外的需要“編程”的過(guò)程,實(shí)現(xiàn)“源代碼”,也可以稱之為測(cè)試腳本。于是開展自動(dòng)化測(cè)試的方式基本上如下:
?
?
?
自動(dòng)化測(cè)試的典型金字塔原理
談到自動(dòng)化測(cè)試,就不得不提的一個(gè)人和概念就是:Martin Fowler和他的金字塔原理。首先請(qǐng)看金字塔原理的圖示如下:
?
?
?
該圖說(shuō)明了三個(gè)問(wèn)題:
自動(dòng)化測(cè)試包括三個(gè)方面:UI前端界面,Service服務(wù)契約和Unit底層單元
越是底層的測(cè)試,運(yùn)行速度越快,時(shí)間開銷越少,金錢開銷越少
越是頂層的測(cè)試,運(yùn)行速度越慢,時(shí)間開銷越多,金錢開銷越多
這是理想中的金字塔原理。
在實(shí)際的項(xiàng)目中,尤其是結(jié)合國(guó)內(nèi)的項(xiàng)目實(shí)踐,其實(shí)還隱藏了另一個(gè)問(wèn)題:越是頂層的測(cè)試,效果越明顯。有句話說(shuō)“貴的東西,除了貴,其他都是好的!”能夠很清晰的闡述這個(gè)觀點(diǎn)。
金字塔原理在國(guó)內(nèi)的適應(yīng)性也有一定的問(wèn)題
自動(dòng)化測(cè)試的起步不是特別早
甚至軟件測(cè)試很長(zhǎng)一段時(shí)間都在進(jìn)行基于業(yè)務(wù)的手工測(cè)試,測(cè)試人員的代碼能力相對(duì)較弱
開發(fā)人員在代碼中不太習(xí)慣寫單元測(cè)試
近些年基于服務(wù)契約的API測(cè)試也在興起
相對(duì)來(lái)說(shuō),在基于UI前端界面的自動(dòng)化測(cè)試反倒是開展和實(shí)施的不是特別多。盡管基于界面的測(cè)試帶來(lái)的效果還是能夠立竿見(jiàn)影的。對(duì)于產(chǎn)品的質(zhì)量提升,還是比較容易有保證。
?
自動(dòng)化測(cè)試的適用范圍
自動(dòng)化測(cè)試可以涉及和試用的范圍主要在以下方面:
基于Web UI的瀏覽器應(yīng)用的界面測(cè)試
基于WebService或者WebAPI的服務(wù)契約測(cè)試
基于WCF、.net remoting、Spring等框架的服務(wù)的集成測(cè)試
基于APP UI的移動(dòng)應(yīng)用界面測(cè)試
基于Java、C#等編程文件進(jìn)行的單元測(cè)試
本文集中討論第一條:基于Web UI的瀏覽器應(yīng)用的界面測(cè)試。界面的改動(dòng)對(duì)于測(cè)試來(lái)說(shuō),具有較大的成本風(fēng)險(xiǎn)。主要考慮以下方面:
任務(wù)測(cè)試明確,不會(huì)頻繁變動(dòng)
每日構(gòu)建后的測(cè)試驗(yàn)證
比較頻繁的回歸測(cè)試
軟件系統(tǒng)界面穩(wěn)定,變動(dòng)少
需要在多平臺(tái)上運(yùn)行的相同測(cè)試案例、組合遍歷型的測(cè)試、大量的重復(fù)任務(wù)
軟件維護(hù)周期長(zhǎng)
項(xiàng)目進(jìn)度壓力不太大
被測(cè)軟件系統(tǒng)開發(fā)比較規(guī)范,能夠保證系統(tǒng)的可測(cè)試性
具備大量的自動(dòng)化測(cè)試平臺(tái)
測(cè)試人員具備較強(qiáng)的編程能力
?
?
自動(dòng)化測(cè)試的流程
自動(dòng)化測(cè)試和普通的手工測(cè)試遵循的測(cè)試流程,與項(xiàng)目的具體實(shí)踐相關(guān)。一般來(lái)說(shuō),也是需要從測(cè)試計(jì)劃開始涉及自動(dòng)化測(cè)試的。
測(cè)試計(jì)劃:劃定自動(dòng)化測(cè)試的范圍包含哪些需求,涉及到哪些測(cè)試過(guò)程
測(cè)試策略:確定自動(dòng)化測(cè)試的工具、編程方案、代碼管理、測(cè)試重點(diǎn)
測(cè)試設(shè)計(jì):使用測(cè)試設(shè)計(jì)方法對(duì)被測(cè)試的需求進(jìn)行設(shè)計(jì),得出測(cè)試的測(cè)試點(diǎn)、用例思維導(dǎo)圖等
測(cè)試實(shí)施:根據(jù)測(cè)試設(shè)計(jì)進(jìn)行用例編寫,并且將測(cè)試用例用編程的方式實(shí)現(xiàn)測(cè)試腳本
測(cè)試執(zhí)行:執(zhí)行測(cè)試用例,運(yùn)行測(cè)試腳本,生成測(cè)試結(jié)果
?
1.2 自動(dòng)化測(cè)試工具基于Web UI的自動(dòng)化測(cè)試工具主要有兩大類:付費(fèi)的商業(yè)版工具和免費(fèi)使用的開源版工具。典型的有兩種:
UFT,QTP被惠普收購(gòu)以后的新名稱。
通過(guò)程序的錄制,可以實(shí)現(xiàn)測(cè)試的編輯
錄制的測(cè)試腳本是 VBScript 語(yǔ)法
成熟版的商業(yè)付費(fèi)工具
工具比較龐大,對(duì)具體的項(xiàng)目定制測(cè)試有難度
?
SELENIUM,本次選擇的開源工具
本身不是測(cè)試工具,只是模擬瀏覽器操作的工具
背后有 Google 維護(hù)源代碼
支持全部主流的瀏覽器
支持主流的編程語(yǔ)言,包括:Java、Python、C#、PHP、Ruby、JavaScript等
工具很小,可以實(shí)現(xiàn)對(duì)測(cè)試項(xiàng)目的定制測(cè)試方案
基于標(biāo)準(zhǔn)的 WebDriver 語(yǔ)法規(guī)范
?
1.2.1 Selenium 基本介紹
Selenium`是開源的自動(dòng)化測(cè)試工具,它主要是用于Web 應(yīng)用程序的自動(dòng)化測(cè)試,不只局限于此,同時(shí)支持所有基于web 的管理任務(wù)自動(dòng)化。
?
Selenium官網(wǎng)的介紹
?
Selenium is a suite of tools to automate web browsers across many platforms.
runs in many browsers and operating systems
can be controlled by many programming languages and testing frameworks.
Selenium 官網(wǎng):seleniumhq.org/
Selenium Github 主頁(yè):github.com/SeleniumHQ/…
Selenium 是用于測(cè)試 Web 應(yīng)用程序用戶界面 (UI) 的常用框架。它是一款用于運(yùn)行端到端功能測(cè)試的超強(qiáng)工具。您可以使用多個(gè)編程語(yǔ)言編寫測(cè)試,并且 Selenium 能夠在一個(gè)或多個(gè)瀏覽器中執(zhí)行這些測(cè)試。
Selenium 經(jīng)歷了三個(gè)版本:Selenium 1,Selenium 2 和 Selenium 3。Selenium 也不是簡(jiǎn)單一個(gè)工具,而是由幾個(gè)工具組成,每個(gè)工具都有其特點(diǎn)和應(yīng)用場(chǎng)景。
Selenium 誕生于 2004 年,當(dāng)在 ThoughtWorks 工作的 Jason Huggins 在測(cè)試一個(gè)內(nèi)部應(yīng)用時(shí)。作為一個(gè)聰明的家伙,他意識(shí)到相對(duì)于每次改動(dòng)都需要手工進(jìn)行測(cè)試,他的時(shí)間應(yīng)該用得更有價(jià)值。他開發(fā)了一個(gè)可以驅(qū)動(dòng)頁(yè)面進(jìn)行交互的 Javascript 庫(kù),能讓多瀏覽器自動(dòng)返回測(cè)試結(jié)果。那個(gè)庫(kù)最終變成了 Selenium 的核心,它是 Selenium RC(遠(yuǎn)程控制)和 Selenium IDE 所有功能的基礎(chǔ)。Selenium RC 是開拓性的,因?yàn)闆](méi)有其他產(chǎn)品能讓你使用自己喜歡的語(yǔ)言來(lái)控制瀏覽器。這就是 Selenium 1。
然而,由于它使用了基于 Javascript 的自動(dòng)化引擎,而瀏覽器對(duì) Javascript 又有很多安全限制,有些事情就難以實(shí)現(xiàn)。更糟糕的是,網(wǎng)站應(yīng)用正變得越來(lái)越強(qiáng)大,它們使用了新瀏覽器提供的各種特性,都使得這些限制讓人痛苦不堪。
在 2006 年,一名 Google 的工程師, Simon Stewart 開始基于這個(gè)項(xiàng)目進(jìn)行開發(fā),這個(gè)項(xiàng)目被命名為 WebDriver。此時(shí),Google 早已是 Selenium 的重度用戶,但是測(cè)試工程師們不得不繞過(guò)它的限制進(jìn)行工具。Simon 需要一款能通過(guò)瀏覽器和操作系統(tǒng)的本地方法直接和瀏覽器進(jìn)行通話的測(cè)試工具,來(lái)解決Javascript 環(huán)境沙箱的問(wèn)題。WebDriver 項(xiàng)目的目標(biāo)就是要解決 Selenium 的痛點(diǎn)。
到了 2008 年,Selenium 和 WebDriver 兩個(gè)項(xiàng)目合并。Selenium 有著豐富的社區(qū)和商業(yè)支持,但 WebDriver 顯然代表著未來(lái)的趨勢(shì)。兩者的合并為所有用戶提供了一組通用功能,并且借鑒了一些測(cè)試自動(dòng)化領(lǐng)域最閃光的思想。這就是 Selenium 2。
2016 年,Selenium 3 誕生。移除了不再使用的 Selenium 1 中的 Selenium RC,并且官方重寫了所有的瀏覽器驅(qū)動(dòng)。
?
?
Selenium 工具集
?
Selenium IDE
Selenium IDE (集成開發(fā)環(huán)境) 是一個(gè)創(chuàng)建測(cè)試腳本的原型工具。它是一個(gè) Firefox 插件,實(shí)現(xiàn)簡(jiǎn)單的瀏覽器操作的錄制與回放功能,提供創(chuàng)建自動(dòng)化測(cè)試的建議接口。Selenium IDE 有一個(gè)記錄功能,能記錄用戶的操作,并且能選擇多種語(yǔ)言把它們導(dǎo)出到一個(gè)可重用的腳本中用于后續(xù)執(zhí)行。這里向大家推薦一個(gè)測(cè)試交流圈q裙:1007119548。
?
?
Selenium RC
Selenium RC 是selenium 家族的核心工具,Selenium RC 支持多種不同的語(yǔ)言編寫自動(dòng)化測(cè)試腳本,通過(guò)selenium RC 的服務(wù)器作為代理服務(wù)器去訪問(wèn)應(yīng)用從而達(dá)到測(cè)試的目的。
selenium RC 使用分Client Libraries 和Selenium Server。
Client Libraries 庫(kù)主要主要用于編寫測(cè)試腳本,用來(lái)控制selenium Server 的庫(kù)。
Selenium Server 負(fù)責(zé)控制瀏覽器行為,總的來(lái)說(shuō),Selenium Server 主要包括3 個(gè)部分:Launcher、Http Proxy、Core。
?
?
Selenium Grid
Selenium Grid 使得 Selenium RC 解決方案能提升針對(duì)大型的測(cè)試套件或者哪些需要運(yùn)行在多環(huán)境的測(cè)試套件的處理能力。Selenium Grid 能讓你并行的運(yùn)行你的測(cè)試,也就是說(shuō),不同的測(cè)試可以同時(shí)跑在不同的遠(yuǎn)程機(jī)器上。這樣做有兩個(gè)有事,首先,如果你有一個(gè)大型的測(cè)試套件,或者一個(gè)跑的很慢的測(cè)試套件,你可以使用 Selenium Grid 將你的測(cè)試套件劃分成幾份同時(shí)在幾個(gè)不同的機(jī)器上運(yùn)行,這樣能顯著的提升它的性能。同時(shí),如果你必須在多環(huán)境中運(yùn)行你的測(cè)試套件,你可以獲得多個(gè)遠(yuǎn)程機(jī)器的支持,它們將同時(shí)運(yùn)行你的測(cè)試套件。在每種情況下,Selenium Grid 都能通過(guò)并行處理顯著地縮短你的測(cè)試套件的處理時(shí)間。
?
?
Selenium WebDriver
WebDriver 是 Selenium 2 主推的工具,事實(shí)上WebDriver是Selenium RC的替代品,因?yàn)镾elenium需要保留向下兼容性的原因,在 Selenium 2 中, Selenium RC才沒(méi)有被徹底的拋棄,如果使用Selenium開發(fā)一個(gè)新的自動(dòng)化測(cè)試項(xiàng)目,那么我們強(qiáng)烈推薦使用Selenium2 的 WebDriver進(jìn)行編碼。另外, 在Selenium 3 中,Selenium RC 被移除了。
?
?
?
Python 語(yǔ)言的選擇,便捷
測(cè)試人員的編程能力普遍不是很強(qiáng),而Python作為一種腳本語(yǔ)言,不僅功能強(qiáng)大,而且語(yǔ)法優(yōu)美,支持多種自動(dòng)化測(cè)試工具,而且學(xué)習(xí)上手比較容易。
Python的社區(qū)發(fā)展比較好,有著非常多的文檔和支持庫(kù),另外Python也可以在Web開發(fā)、數(shù)據(jù)處理、科學(xué)計(jì)算等縱多領(lǐng)域有著非常好的應(yīng)用前景。
對(duì)于有一定編程基礎(chǔ)的人員,使用Python作為自動(dòng)化測(cè)試的語(yǔ)言可以非常順暢的轉(zhuǎn)換,幾乎沒(méi)有學(xué)習(xí)成本。同時(shí)Python是標(biāo)準(zhǔn)的面向?qū)ο蟮木幊陶Z(yǔ)言,對(duì)于C#、Java等面向?qū)ο蟮恼Z(yǔ)言有著非常好的示例作用,通過(guò)Python的示例可以非常輕松的觸類旁通,使用其他語(yǔ)言進(jìn)行Selenium2.0的WebDriver的使用。
讀音:/"pa?θ?n/
Python的創(chuàng)始人為Guido Van Rossum。1989年圣誕節(jié)期間,在阿姆斯特丹,Guido為了打發(fā)圣誕節(jié)的無(wú)趣,決心開發(fā)一個(gè)新的腳本解釋程序,做為ABC 語(yǔ)言的一種繼承。之所以選中Python(大蟒蛇的意思)作為程序的名字,是因?yàn)樗且粋€(gè)叫Monty Python的喜劇團(tuán)體的愛(ài)好者。
Python 語(yǔ)言除了在自動(dòng)化測(cè)試領(lǐng)域有出色的表現(xiàn)外,在系統(tǒng)編程,網(wǎng)絡(luò)編程,web 開發(fā),GUI開發(fā),科學(xué)計(jì)算,游戲開發(fā)等多個(gè)領(lǐng)域應(yīng)用非常廣泛,而且具有非常良好的社區(qū)支持。也就是說(shuō)學(xué)習(xí)和掌握python 編程,其實(shí)是為你打開了一道更廣闊的大門。
?
?
使用的工具集
IDE: Jetbrains PyCharm
語(yǔ)言: Python
工具: Selenium WebDriver
源代碼管理: SVN/Git
?
1.2.2 JetBrains PyCharm 使用
?
JetBrains PyCharm 的介紹
PyCharm 是 JetBrains 公司針對(duì)Python推出的IDE(Integrated Development Environment,集成開發(fā)環(huán)境)。是目前最好的Python IDE之一。目前包含了兩個(gè)版本:
社區(qū)版,Community Edition
專業(yè)版,Professional Edition
付費(fèi)
比社區(qū)版主要多了Web開發(fā)框架
?
我們推薦使用免費(fèi)的社區(qū)版本,進(jìn)行Python腳本的編寫和自動(dòng)化測(cè)試執(zhí)行。
PyCharm可以在官網(wǎng)下載,www.jetbrains.com
?
PyCharm 安裝后,如果也安裝過(guò) Python 環(huán)境,可以直接進(jìn)行操作。否則請(qǐng)?jiān)?1.2.3 中安裝好 Python,再使用 PyCharm。
?
安裝按照默認(rèn)的步驟安裝
?
使用方式
?
Create New Project:
創(chuàng)建新的項(xiàng)目,選擇項(xiàng)目創(chuàng)建的位置,選擇Python的解釋器
?image
?
設(shè)置location,項(xiàng)目的路徑和名稱
名稱必須以英文字母開頭
名稱不可以有空格
位置不可以在 C:Pytho34中,應(yīng)該放到普通的目錄中
?
設(shè)置interpreter
一個(gè)電腦可以裝多個(gè) Python
這里選擇一個(gè)你需要的 Pythpn
?
新建Python文件
image
?
?image
?
?在創(chuàng)建的文件中編寫第一個(gè)Python語(yǔ)句
?
?
?
?
print("hello Python!")
image
?
右鍵該文件,選擇Run hello,運(yùn)行該語(yǔ)句,在下面的運(yùn)行框中會(huì)顯示運(yùn)行結(jié)果
C:Python35python.exe D:/Git/WeekendSelenium/untitled/hello.py
hello python!
Process finished with exit code 0
如圖
image
?
Open
打開已經(jīng)存在的項(xiàng)目,比如別人發(fā)給你的項(xiàng)目,或者已經(jīng)創(chuàng)建過(guò)的項(xiàng)目
image
?
image
?
?
安裝后進(jìn)行設(shè)置如下:
?
設(shè)置行號(hào)的顯示
在PyCharm 里,顯示行號(hào)有兩種辦法:
?
臨時(shí)設(shè)置(不推薦)。右鍵單擊行號(hào)處,選擇 Show Line Numbers。
image
?
image.gif
?
?
但是這種方法,只對(duì)一個(gè)文件有效,并且,重啟PyCharm 后消失。
?
?
永久設(shè)置。File --> Settings -->Editor -->Appearance , 之后勾選Show Line Numbers。
?
?
?
image
?
?
設(shè)置字體
選擇 Settings | Editor | Colors & Fonts | Fonts
Save AS 主題
選擇 Source Code Pro(建議選擇,等寬字體)
?
?
SVN / Git 在工具中的集成
源代碼管理工具(VCS, version control system)
?
如果TortoiseSVN版本低于 1.8,需要先升級(jí)安裝1.8以上的版本
選擇SVN(git)作為代碼的源代碼管理工具。集成在PyCharm中的步驟如下
代碼已經(jīng)存在在SVN repo中:把代碼放到SVN在本地簽出(check out)的文件夾目錄中,例如 D:SVNXXProjectTrunck
?
image
?
2. 代碼沒(méi)有創(chuàng)建:在本地的SVN項(xiàng)目文件夾中新建項(xiàng)目,用PyCharm打開,提交。
image
?
image
?
image
?
3. 用PyCharm打開 剛剛部署的代碼 4. 選擇PyCharm的 `VCS`|`Enable VCS integration`,選擇 Subversion(svn) 或者 Git
image
?
5. 右鍵項(xiàng)目文件的根目錄,選擇 Subversion | add to VCS
?
?
6. 右鍵項(xiàng)目文件的根目錄,或者選 VCS | Commit Directory...
image
?
?
每天打開代碼后,右鍵項(xiàng)目文件的根目錄,首先 Subversion | update project
?
?
如果有沖突,先本地手工保存你做的修改(備份你的文件到其他地方,SVN目錄之外的地方,然后Revert)
?
1.2.3 Selenium 的環(huán)境搭建
?
在 Windows 搭建和部署 Selenium 工具
主要包括兩個(gè)步驟:
?
安裝 Python 語(yǔ)言
Python的官方網(wǎng)站:www.python.org
Python 目前并行了兩套版本,2.x 和 3.x。如果你之前沒(méi)有 Python 的使用經(jīng)驗(yàn),建議使用 Python 3.x 版本。兩套版本互相不兼容,并且 Python 從 3.5(含)開始,不再支持 Windows XP 系統(tǒng),請(qǐng)注意。
?
選擇安裝目錄
3.4或者3.4以下的版本,都是 C:python34
3.5以上的目錄,默認(rèn)裝個(gè)人文件夾,建議用類似上面的目錄,比如C:python35
?
?
?
?
勾選添加環(huán)境變量
勾選Add Python.exe to PATH
?
?
安裝過(guò)程中不要關(guān)閉彈出來(lái)的命令行窗口
?
關(guān)于 Python 的安裝,也可以選擇一些第三方的Python 安裝包,典型的有 Anaconda3,這樣的包有豐富的第三方庫(kù),在使用 Python 的過(guò)程中會(huì)更加方便。這里向大家推薦一個(gè)測(cè)試交流圈q裙:1007119548。
Anaconda 的官網(wǎng):www.continuum.io/anaconda-ov…
?
?
?
安裝 Selenium 工具包
由于 安裝好的 Python 默認(rèn)有 pip Python 包管理工具,可以通過(guò) pip 非常方便的安裝 Selenium。
?
啟動(dòng)命令行工具:Win+R | 輸入 cmd | 回車
?
?
輸入命令:
pip install selenium
image.gif
?
該命令的執(zhí)行需要有互聯(lián)網(wǎng)聯(lián)網(wǎng)環(huán)境。此外該命令有以下幾種選項(xiàng)可以使用
?
安裝指定的版本,例如安裝指定的 Selenium 3.4.3
pip install selenium==3.4.3
?
?
安裝最新版的 Selenium
pip install -U selenium
# -U 也可以用 --upgrade
pip install --upgrade selenium
?
?
?
?
卸載安裝當(dāng)前的 Selenium
pip uninstall selenium
image.gif
?
?
當(dāng)然,如果您的機(jī)器處于非接入互聯(lián)網(wǎng)的環(huán)境,您可以事先下載 Selenium 的 Python 安裝包,再進(jìn)行手動(dòng)安裝。
?
?
官方下載地址:pypi.python.org/pypi/seleni…
?
?
上述地址會(huì)下載最新版的 Selenium,目前最先版的是 3.4.3,您也可以根據(jù)以下路徑下載指定的 3.4.3
?
?
Selenium 3.4.3 下載地址:pypi.python.org/pypi/seleni…
?
?
下載后,解壓該壓縮包
?
?
然后用命令行進(jìn)入該壓縮包的根目錄,輸入命令進(jìn)行安裝
?
python setup.py install
?
配置 瀏覽器 和 驅(qū)動(dòng)
?
Selenium 2 可以默認(rèn)支持Firefox 46.0或者更低版本,對(duì)于其他瀏覽器需要額外安裝驅(qū)動(dòng)。
?
?
Selenium 3 對(duì)于所有的瀏覽器都需要安裝驅(qū)動(dòng),本文以 Chrome 和 Firefox、IE為例設(shè)置瀏覽器和驅(qū)動(dòng)。
?
ChromeDriver下載地址:chromedriver.storage.googleapis.com/index.html
?
?
ChromeDriver 與 Chrome 對(duì)應(yīng)關(guān)系表:
ChromeDriver版本 | 支持的Chrome版本 |
---|---|
v2.31 | v58-60 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
v2.25 | v53-55 |
v2.24 | v52-54 |
v2.23 | v51-53 |
v2.22 | v49-52 |
v2.21 | v46-50 |
v2.20 | v43-48 |
?
?
GeckoDriver下載地址:github.com/mozilla/gec…
?
?
GeckoDriver 與 Firefox 的對(duì)應(yīng)關(guān)系表:
GeckoDriver版本 | 支持的Firefox版本 |
---|---|
v0.18.0 | v56 |
v0.17.0 | v55 |
v0.16.0 | v54,需要Selenium 3.4或者以上 |
v0.15.0 | v53,需要Selenium 3.3或者以上 |
?
?
IEDriverServer下載地址:selenium-release.storage.googleapis.com/index.html
?
?
IEDriverServer 的版本需要與 Selenium 保持嚴(yán)格一致。
?
?
?
瀏覽器驅(qū)動(dòng)的配置
首先,將下載好的對(duì)應(yīng)版本的瀏覽器安裝。
其次,在 Python 的根目錄中,放入瀏覽器驅(qū)動(dòng)。
最好再重啟電腦,一般情況下不重啟也可以的。
?
?
?
1.3 Selenium 的最簡(jiǎn)腳本通過(guò)上一節(jié)的環(huán)境安裝成功以后,我們可以進(jìn)行第一個(gè)對(duì)Selenium 的使用,就是最簡(jiǎn)腳本編寫。腳本如下:
# 聲明一個(gè)司機(jī),司機(jī)是個(gè)Chrome類的對(duì)象
driver = webdriver.Chrome()
# 讓司機(jī)加載一個(gè)網(wǎng)頁(yè)
driver.get("http://demo.ranzhi.org")
# 給司機(jī)3秒鐘去打開
sleep(3)
# 開始登錄
# 1. 讓司機(jī)找用戶名的輸入框
we_account = driver.find_element_by_css_selector("#account")
we_account.clear()
we_account.send_keys("demo")
# 2. 讓司機(jī)找密碼的輸入框
we_password = driver.find_element_by_css_selector("#password")
we_password.clear()
we_password.send_keys("demo")
# 3. 讓司機(jī)找 登錄按鈕 并 單擊
driver.find_element_by_css_selector("#submit").click()
sleep(3)
?
實(shí)際上一段20行的代碼,也不能算太少了。但是這段代碼的使用,確實(shí)體現(xiàn)了 Selenium 的最簡(jiǎn)單的使用。我們?cè)谙旅鎯?nèi)容進(jìn)行闡述。
?
關(guān)于面向?qū)ο缶幊?/p>
通過(guò)前面的介紹,我們知道 Selenium 支持多種語(yǔ)言,并且推薦使用面向?qū)ο蟮姆绞竭M(jìn)行編程。接下來(lái)我們將著重介紹如何使用面向?qū)ο蟮姆绞竭M(jìn)行編程。
我們利用 Python 進(jìn)行面向?qū)ο缶幊?,需要首先了解一個(gè)概念:類
?
類
類是任何面向?qū)ο缶幊痰恼Z(yǔ)言的基本組成,描述了使用的基本方法。我們可能在目前,還不是特別明白類的含義,但是我們可以通過(guò)類的使用,來(lái)進(jìn)一步了解。
?
?
類的使用
類,通過(guò)實(shí)例化進(jìn)行使用。比如有一個(gè)類: Driver,該類有一個(gè)方法: head(road)
那么關(guān)于這個(gè)類的使用,只需要兩個(gè)步驟:
實(shí)例化該類:d = Driver()
調(diào)用類的方法:d.head("中山路")
?
?
了解上述例子和使用以后,我們來(lái)看具體的 Selenium 的使用。
?
?這里向大家推薦一個(gè)測(cè)試交流圈q裙:1007119548。
?
?
具體的對(duì)象的使用
在面向?qū)ο蟮睦砟羁磥?lái),任何的編碼,都是由對(duì)象而來(lái)的,這里也不例外。和之前介紹 WebDriver 時(shí)候的描述對(duì)應(yīng),我們需要用到兩種主要的類,并將其實(shí)例化。
WebDriver 類:主要靠直接實(shí)例化該類為對(duì)象,然后用其對(duì)象直接調(diào)用該類的方法和屬性
WebElement 類:主要通過(guò) WebDriver 類實(shí)例化的對(duì)象,通過(guò)對(duì)頁(yè)面元素的查找,得到 WebElement 類的對(duì)象,然后調(diào)用該類的方法和屬性。
上述代碼中,使用了一個(gè) WebDriver 類 的對(duì)象,即第2行,聲明了該類的對(duì)象,并賦值給變量 driver,接著變量 driver 作為 WebDriver 類的對(duì)象,使用了多個(gè) WebDriver 類的方法。
?
注意:Chrome 是 WebDriver 的子類,是 WebDriver 類的一種
get(url): 第5行,打開網(wǎng)址
find_element_by_css_selector(selector): 第12、17、22行都使用了該方法,同時(shí)通過(guò)對(duì)該方法的調(diào)用,分別各產(chǎn)生了一個(gè) WebElement類的對(duì)象,we_account,we_password和最后一個(gè)匿名的對(duì)象,并通過(guò)產(chǎn)生的三個(gè)對(duì)象,調(diào)用 WebElement 類的方法
clear():清理頁(yè)面元素中的文字
send_keys(text):給頁(yè)面元素中,輸入新的文字
click():鼠標(biāo)左鍵點(diǎn)擊頁(yè)面元素
?
正是通過(guò)這樣的面向?qū)ο蟮姆绞剑a(chǎn)生 Web司機(jī)(WebDriver類的對(duì)象),并且通過(guò) Web司機(jī)不懈的努力,尋找到各種 Web元素(WebElement類的對(duì)象)進(jìn)行操作,這樣便實(shí)現(xiàn)了 Selenium WebDriver 作為一款出色的瀏覽器測(cè)試工具,進(jìn)行瀏覽器UI界面的自動(dòng)化測(cè)試的代碼編寫和用例執(zhí)行。
?
1.4 Selenium WebDriver API 的使用通過(guò)上述最簡(jiǎn)腳本的使用,我們可以來(lái)進(jìn)一步了解 Selenium 的使用。事實(shí)上,上一節(jié)用的,便是 Selenium 的 WebDriver API。API(Application Programming Interface,應(yīng)用程序編程接口,即通過(guò)編程語(yǔ)言,操作 WebDriver 的方法集合)
Selenium WebDriver API 官方參考:seleniumhq.github.io/selenium/do…
具體API文檔地址:seleniumhq.github.io/selenium/do…
API 使用: 用現(xiàn)成的類(大部分情況)的方法進(jìn)行編程
WebDriver
WebElement
?
API 文檔
編程使用說(shuō)明
介紹了每個(gè)方法的使用
方法的作用
方法的參數(shù)
方法的返回值
?
?
1.4.1 控制瀏覽器
瀏覽器的控制也是自動(dòng)化測(cè)試的一個(gè)基本組成部分,我們可以將瀏覽器最大化,設(shè)置瀏覽器的高度和寬度以及對(duì)瀏覽器進(jìn)行導(dǎo)航操作等。
# 瀏覽器打開網(wǎng)址
driver.get("https://www.baidu.com")
# 瀏覽器最大化
driver.maximize_window()
# 設(shè)置瀏覽器的高度為800像素,寬度為480像素
driver.set_window_size(480, 800)
# 瀏覽器后退
driver.back()
# 瀏覽器前進(jìn)
driver.forward()
# 瀏覽器關(guān)閉
driver.close()
# 瀏覽器退出
driver.quit()
1.4.2 元素定位操作
WebDriver提供了一系列的定位符以便使用元素定位方法。常見(jiàn)的定位符有以下幾種:
id
name
class name
tag
link text
partial link text
xpath
css selector
那么我們以下的操作將會(huì)基于上述的定位符進(jìn)行定位操作。
對(duì)于元素的定位,WebDriver API可以通過(guò)定位簡(jiǎn)單的元素和一組元素來(lái)操作。在這里,我們需要告訴Selenium如何去找元素,以至于他可以充分的模擬用戶行為,或者通過(guò)查看元素的屬性和狀態(tài),以便我們執(zhí)行一系列的檢查。
在Selenium2中,WebDriver提供了多種多樣的find_element_by方法在一個(gè)網(wǎng)頁(yè)里面查找元素。這些方法通過(guò)提供過(guò)濾標(biāo)準(zhǔn)來(lái)定位元素。當(dāng)然WebDriver也提供了同樣多種多樣的find_elements_by的方式去定位多個(gè)元素。
盡管上述的方式,可以進(jìn)行元素定位,實(shí)際上我們也是更多的用組合的方式進(jìn)行元素定位。
方法Method | 描述Description | 參數(shù)Argument | 示例Example |
---|---|---|---|
id | 該方法通過(guò)ID的屬性值去定位查找單個(gè)元素 | id: 需要被查找的元素的ID | find_element_by_id("search") |
name | 該方法通過(guò)name的屬性值去定位查找單個(gè)元素 | name: 需要被查找的元素的名稱 | find_element_by_name("q") |
class name | 該方法通過(guò)class的名稱值去定位查找單個(gè)元素 | class_name: 需要被查找的元素的類名 | find_element_by_class_name("input-text") |
tag_name | 該方法通過(guò)tag的名稱值去定位查找單個(gè)元素 | tag: 需要被查找的元素的標(biāo)簽名稱 | find_element_by_tag_name("input") |
link_text | 該方法通過(guò)鏈接文字去定位查找單個(gè)元素 | link_text: 需要被查找的元素的鏈接文字 | find_element_by_link_text("Log In") |
partial_link_text | 該方法通過(guò)部分鏈接文字去定位查找單個(gè)元素 | link_text: 需要被查找的元素的部分鏈接文字 | find_element_by_partial_link_text("Long") |
xpath | 該方法通過(guò)XPath的值去定位查找單個(gè)元素 | xpath: 需要被查找的元素的xpath | find_element_by_xpath("http://*[@id="xx"]/a") |
css_selector | 該方法通過(guò)CSS選擇器去定位查找單個(gè)元素 | css_selector: 需要被查找的元素的ID | find_element_by_css_selector("#search") |
接下來(lái)的列表將會(huì)詳細(xì)展示find_elements_by的方法集合。這些方法依據(jù)匹配的具體標(biāo)準(zhǔn)返回一系列的元素。
方法Method | 描述Description | 參數(shù)Argument | 示例Example |
---|---|---|---|
id | 該方法通過(guò)ID的屬性值去定位查找多個(gè)元素 | id: 需要被查找的元素的ID | find_elements_by_id("search") |
name | 該方法通過(guò)name的屬性值去定位查找多個(gè)元素 | name: 需要被查找的元素的名稱 | find_elements_by_name("q") |
class_name | 該方法通過(guò)class的名稱值去定位查找多個(gè)元素 | class_name: 需要被查找的元素的類名 | find_elements_by_class_name("input-text") |
tag_name | 該方法通過(guò)tag的名稱值去定位查找多個(gè)元素 | tag: 需要被查找的元素的標(biāo)簽名稱 | find_elements_by_tag_name("input") |
link_text | 該方法通過(guò)鏈接文字去定位查找多個(gè)元素 | link_text: 需要被查找的元素的鏈接文字 | find_elements_by_link_text("Log In") |
partial_link_text | 該方法通過(guò)部分鏈接文字去定位查找多個(gè)元素 | link_text: 需要被查找的元素的部分鏈接文字 | find_elements_by_partial_link_text("Long") |
xpath | 該方法通過(guò)XPath的值去定位查找多個(gè)元素 | xpath: 需要被查找的元素的xpath | find_elements_by_xpath("http://div[contains(@class,"list")]") |
css_selector | 該方法通過(guò)CSS選擇器去定位查找多個(gè)元素 | css_selector: 需要被查找的元素的ID | find_element_by_css_selector(".input_class") |
依據(jù)ID查找
請(qǐng)查看如下HTML的代碼,以便實(shí)現(xiàn)通過(guò)ID的屬性值去定義一個(gè)查找文本框的查找:
"search" type="text" name="q" value=""
class="input-text" maxlength="128" autocomplete="off"/>
根據(jù)上述代碼,這里我們使用find_element_by_id()的方法去查找搜索框并且檢查它的最大長(zhǎng)度maxlength屬性。我們通過(guò)傳遞ID的屬性值作為參數(shù)去查找,參考如下的代碼示例:
def test_search_text_field_max_length(self):
# get the search textbox
search_field = self.driver.find_element_by_id("search")
# check maxlength attribute is set to 128
self.assertEqual("128", search_field.get_attribute("maxlength"))
如果使用find_elements_by_id()方法,將會(huì)返回所有的具有相同ID屬性值的一系列元素。
依據(jù)名稱name查找
這里還是根據(jù)上述ID查找的HTML代碼,使用find_element_by_name的方法進(jìn)行查找。參考如下的代碼示例:
# get the search textbox
self.search_field = self.driver.find_element_by_name("q")
image.gif
?
同樣,如果使用find_elements_by_name()方法,將會(huì)返回所有的具有相同name屬性值的一系列元素。
依據(jù)class name查找
除了上述的ID和name的方式查找,我們還可以使用class name的方式進(jìn)行查找和定位。
?
事實(shí)上,通過(guò)ID,name或者類名class name查找元素是最提倡推薦的和最快的方式。當(dāng)然Selenium2 WebDriver也提供了一些其他的方式,在上述三類方式條件不足,查找無(wú)效的時(shí)候,可以通過(guò)這些其他方式來(lái)查找。這些方式將會(huì)在后續(xù)的內(nèi)容中講述。
請(qǐng)查看如下的HTML代碼,通過(guò)改代碼進(jìn)行練習(xí)和理解.
image.gif
?
根據(jù)上述代碼,使用find_element_by_class_name()方法去定位元素。
def test_search_button_enabled(self):
# get Search button
search_button = self.driver.find_element_by_class_name("button")
# check Search button is enabled
self.assertTrue(search_button.is_enabled())
同樣的如果使用find_elements_by_class_name()方法去定位元素,將會(huì)返回所有的具有相同name屬性值的一系列元素。
依據(jù)標(biāo)簽名tag name查找
利用標(biāo)簽的方法類似于利用類名等方法進(jìn)行查找。我們可以輕松的查找出一系列的具有相同標(biāo)簽名的元素。例如我們可以通過(guò)查找表中的 下面有一個(gè)HTML的示例,這里在無(wú)序列表中使用了標(biāo)簽。 這里面我們使用find_elements_by_tag_name()的方式去獲取全部的圖片,在此之前,我們將會(huì)使用find_element_by_class_name()去獲取到指定的 具體代碼如下: 依據(jù)鏈接文字link查找 鏈接文字查找通常比較簡(jiǎn)單。使用find_element_by_link_text請(qǐng)查看以下示例 測(cè)試代碼如下: 依據(jù)部分鏈接文字partial text查找 這里依舊使用上述的列子進(jìn)行代碼編寫: 依據(jù)XPath進(jìn)行查找 XPath是一種在XML文檔中搜索和定位節(jié)點(diǎn)node的一種查詢語(yǔ)言。所有的主流Web瀏覽器都支持XPath。Selenium2可以用強(qiáng)大的XPath在頁(yè)面中查找元素。 常用的XPath的方法有starts-with(),contains()和ends-with()等 若想要了解更多關(guān)于XPath的內(nèi)容,請(qǐng)查看www.w3schools.com/XPath/ 如下有一段HTML代碼,其中里面的沒(méi)有使用ID,name或者類屬性,所以我們無(wú)法使用之前的方法。亞這里我們可以通過(guò)的alt屬性,定位到指定的tag。 具體代碼如下: 當(dāng)然,如果使用find_elements_by_xpath()的方法,將會(huì)返回所有匹配了XPath查詢的元素。 依據(jù)CSS選擇器進(jìn)行查找 CSS是一種設(shè)計(jì)師用來(lái)描繪HTML文檔的視覺(jué)的層疊樣式表。一般來(lái)說(shuō)CSS用來(lái)定位多種多樣的風(fēng)格,同時(shí)可以用來(lái)是同樣的標(biāo)簽使用同樣的風(fēng)格等。類似于XPath,Selenium2也可以使用CSS選擇器來(lái)定位元素。 請(qǐng)查看如下的HTML文檔。 "block-subtitle">Recently added item(s)
"close skip-link-close" href="#" title="Close">×
"empty">You have no items in your shopping cart.
我們來(lái)創(chuàng)建一個(gè)測(cè)試,驗(yàn)證這些消息是否正確。 特殊 iframe 操作 iframe 元素會(huì)創(chuàng)建包含另外一個(gè)文檔的內(nèi)聯(lián)框架(即行內(nèi)框架)。 iframe: 紫禁城 在一個(gè)中,包含了另一個(gè) 示例
這里是段落,標(biāo)記一個(gè)段落,屬于外層
需要定位上面示例中的 :這里是div中的段落,需要被定位 如下是selenium WebDiriver的代碼 特殊 Select 操作 是選擇列表 Select 是個(gè)selenium的類selenium.webdriver.support.select.Select Select 類的路徑: C:Python35Libsite-packagesseleniumwebdriversupportselect.py 示例,選擇 Audi 組合操作 自動(dòng)化經(jīng)驗(yàn)的積累,需要100%按照手工的步驟進(jìn)行操作。 比如步驟如下: 自動(dòng)產(chǎn)生了一個(gè) 點(diǎn)擊 代碼示例 1.4.3 鼠標(biāo)事件操作 Web測(cè)試中,有關(guān)鼠標(biāo)的操作,不只是單擊,有時(shí)候還要做右擊、雙擊、拖動(dòng)等操作。這些操作包含在ActionChains類中。 常用的鼠標(biāo)方法: context_click() # 右擊 double_click() # 雙擊 drag_and_drop() # 拖拽 move_to_element() # 鼠標(biāo)停在一個(gè)元素上 click_and_hold() # 按下鼠標(biāo)左鍵在一個(gè)元素上 例子: 1.4.4 鍵盤事件操作 鍵盤操作經(jīng)常處理的如下: 代碼如下 1.4.5 截圖操作 截圖的方法:save_screenshot(file) 在上一節(jié),我們對(duì) Selenium WebDriver 的使用,僅僅停留在讓網(wǎng)頁(yè)自動(dòng)的進(jìn)行操作的階段,并沒(méi)有對(duì)任何一個(gè)步驟進(jìn)行“檢查”。當(dāng)然,這樣沒(méi)有“檢查”的操作,實(shí)際上是沒(méi)有測(cè)試意義的。那么第一項(xiàng),我們需要解決的便是“檢查”的問(wèn)題。 所謂“檢查”,實(shí)際上就是斷言。對(duì)需要檢查的步驟操作,通過(guò)對(duì)預(yù)先設(shè)置的期望值,和執(zhí)行結(jié)果的實(shí)際值之間的對(duì)比,得到測(cè)試的結(jié)果。在這里,我們并不需要多帶帶的寫 if 語(yǔ)句進(jìn)行各種判定,而是可以使用編程語(yǔ)言中對(duì)應(yīng)的單元測(cè)試框架,即可解決好此類問(wèn)題。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/6925.html 摘要:跳躍表的空間復(fù)雜度為。不過(guò),二叉查找樹是有可能出現(xiàn)一種極端的情況的,就是如果插入的數(shù)據(jù)剛好一直有序,那么所有節(jié)點(diǎn)會(huì)偏向某一邊。例如這種接結(jié)構(gòu)會(huì)導(dǎo)致二叉查找樹的查找效率變?yōu)檫@會(huì)使二叉查找樹大打折扣。假如我們要用某種數(shù)據(jù)結(jié)構(gòu)來(lái)維護(hù)一組有序的int型數(shù)據(jù)的集合,并且希望這個(gè)數(shù)據(jù)結(jié)構(gòu)在插入、刪除、查找等操作上能夠盡可能著快速,那么,你會(huì)用什么樣的數(shù)據(jù)結(jié)構(gòu)呢?
數(shù)組
一種很簡(jiǎn)單的方法應(yīng)該就是采用數(shù)組了... 摘要:同時(shí),在元類中,我們還需要加上一個(gè)判斷,只有在這個(gè)類創(chuàng)建時(shí)才需要控制其類的生成,其他的就不需要了。完整代碼后臺(tái)回復(fù)元類獲取原創(chuàng)不易,如果文章對(duì)你有用的話,點(diǎn)贊留言轉(zhuǎn)發(fā)是對(duì)我的最大支持日常學(xué)代碼不止,還有美和樂(lè)趣
我之前在深入理解python中的類和對(duì)象中說(shuō)過(guò),python中的類也是一個(gè)對(duì)象,可以說(shuō)是類對(duì)象,可以由type來(lái)創(chuàng)建類對(duì)象的。有了這個(gè)知識(shí)我們先看看下面這個(gè)函數(shù):
showIm... 摘要:所以,雅虎的開發(fā)人員就試圖開發(fā)一個(gè)通用的無(wú)單點(diǎn)問(wèn)題的分布式協(xié)調(diào)框架,以便讓開發(fā)人員將精力集中在處理業(yè)務(wù)邏輯上。在立項(xiàng)初期,考慮到之前內(nèi)部很多項(xiàng)目都是使用動(dòng)物的名字來(lái)命名的例如著名的項(xiàng)目雅虎的工程師希望給這個(gè)項(xiàng)目也取一個(gè)動(dòng)物的名字。
前言
提到ZooKeeper,相信大家都不會(huì)陌生。Dubbo,Kafka,Hadoop等等項(xiàng)目里都能看到它的影子。但是你真的了解 ZooKeeper 嗎?如... 摘要:如果你只是簡(jiǎn)單羅列出這幾個(gè)鉤子函數(shù)的名稱,不具體深入闡述的話,你這樣的回答很難令面試官滿意。那么接下來(lái),閏土大叔將手摸手教你如何深入淺出地說(shuō)出令面試官滿意的有亮點(diǎn)的回答。
當(dāng)面試官問(wèn):談?wù)勀銓?duì)vue的生命周期的理解,聽(tīng)到這句話你是不是心里暗自竊喜:這也太容易了吧,不就是beforeCreate、created、beforeMount、mounted、beforeUpdate、updat... 摘要:是一個(gè)瀏覽器自動(dòng)化測(cè)試框架可以模擬用戶的所有操作很久以前就想把李敖大師的所有微博爬取下來(lái)一直沒(méi)空前天看見(jiàn)群里有人推薦和就學(xué)了做了個(gè)你們想爬別人的只要把李敖大師的地址換成你要的就行了我還沒(méi)學(xué)不過(guò)我猜他就是去掉功能的瀏覽器這樣可以讓爬蟲更快如果
selenium 是一個(gè)瀏覽器自動(dòng)化測(cè)試框架.可以模擬用戶的所有操作.
很久以前就想把李敖大師的所有微博爬取下來(lái).一直沒(méi)空,前天看見(jiàn)群里有人推薦s... 閱讀 2018·2021-09-22 16:05 閱讀 9341·2021-09-22 15:03 閱讀 2896·2019-08-30 15:53 閱讀 1707·2019-08-29 11:15 閱讀 919·2019-08-26 13:52 閱讀 2361·2019-08-26 11:32 閱讀 1815·2019-08-26 10:38 閱讀 2579·2019-08-23 17:19來(lái)獲取行數(shù)。
"promos">
。
def test_count_of_promo_banners_images(self):
# get promo banner list
banner_list = self.driver.find_element_by_class_name("promos")
# get images from the banner_list
banners = banner_list.find_elements_by_tag_name("img")
# check there are 20 tags displayed on the page
self.assertEqual(20, len(banners))
"#header-account" class="skip-link skip-account">
"icon">
"label">ACCOUNT Description
def test_my_account_link_is_displayed(self):
# get the Account link
account_link =
self.driver.find_element_by_link_text("ACCOUNT Description")
# check My Account link is displayed/visible in
# the Home page footer
self.assertTrue(account_link.is_displayed())
def test_account_links(self):
# get the all the links with Account text in it
account_links = self.driver.
find_elements_by_partial_link_text("ACCOUNT")
# check Account and My Account link is
# displayed/visible in the Home page footer
self.assertTrue(2, len(account_links))
?
"promos">
def test_vip_promo(self):
# get vip promo image
vip_promo = self.driver.
find_element_by_xpath("http://img[@alt="Shop Private Sales - Members Only"]")
# check vip promo logo is displayed on home page
self.assertTrue(vip_promo.is_displayed())
# click on vip promo images to open the page
vip_promo.click()
# check page title
self.assertEqual("VIP", self.driver.title)
def test_shopping_cart_status(self):
# check content of My Shopping Cart block on Home page
# get the Shopping cart icon and click to open the
# Shopping Cart section
shopping_cart_icon = self.driver.
find_element_by_css_selector("div.header-minicart
span.icon")
shopping_cart_icon.click()
# get the shopping cart status
shopping_cart_status = self.driver.
find_element_by_css_selector("p.empty").text
self.assertEqual("You have no items in your shopping cart.",
shopping_cart_status)
# close the shopping cart section
close_button = self.driver.
find_element_by_css_selector("div.minicart-wrapper
a.close")
close_button.click()
?
這里是H1,標(biāo)記了標(biāo)題
## 查找并定位 iframe
element_frame = driver.find_element_by_css_selector("#iframe-1")
## 切換到剛剛查找到的 iframe
driver.switch_to.frame(element_frame)
## 定位
driver.find_element_by_css_selector("#div-1 > p")
## TODO....
## 退出剛剛切換進(jìn)去的 iframe
driver.switch_to.default_content()
?
## 查找并定位到 select
element_select = driver.find_element_by_css_selector("#brand")
## 用Select類的構(gòu)造方法,實(shí)例化一個(gè)對(duì)象 object_select
object_select = Select(element_select)
## 操作 object_select
object_select.select_by_index(3)
## 也可以這樣
object_select.select_by_value("audi")
## 還可以這樣
object_select.select_by_visible_text("Audi")
的第五個(gè)
driver.find_element_by_css_selector("#customer_chosen").click()
sleep(1)
driver.find_element_by_css_selector("#customer_list > li:nth-child(5)")
# 方法模擬鼠標(biāo)右鍵,參考代碼如下:
# 引入ActionChains 類
from selenium.webdriver.common.action_chains import ActionChains
...
# 定位到要右擊的元素
right =driver.find_element_by_xpath("xx")
# 對(duì)定位到的元素執(zhí)行鼠標(biāo)右鍵操作
ActionChains(driver).context_click(right).perform()
...
# 定位到要雙擊的元素
double = driver.find_element_by_xpath("xxx")
# 對(duì)定位到的元素執(zhí)行鼠標(biāo)雙擊操作
ActionChains(driver).double_click(double).perform()
代碼
描述
send_keys(Keys.BACKSPACE)
刪除鍵(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")
全選(Ctrl+A)
send_keys(Keys.CONTROL,"c")
復(fù)制(Ctrl+C)
from selenium import webdriver
# 引入Keys 類包
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 輸入框輸入內(nèi)容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
# 刪除多輸入的一個(gè)m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(3)
# 輸入空格鍵+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("教程")
time.sleep(3)
# ctrl+a 全選輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")
相關(guān)文章
以后有面試官問(wèn)你跳躍表,你就把這篇文章扔給他
再有人問(wèn)什么是元類,就把這篇文章扔給他!
如果有人問(wèn)你ZooKeeper是什么,就把這篇文章發(fā)給他。
如何解釋vue的生命周期才能令面試官滿意?
selenium 自動(dòng)化爬蟲 5分鐘爬取新浪李敖大師1751條微博.
發(fā)表評(píng)論
0條評(píng)論
Keven
男|高級(jí)講師
TA的文章
閱讀更多
虛擬主機(jī)的瞬時(shí)帶寬什么意思-VPS和虛擬主機(jī)的區(qū)別?
一個(gè)子網(wǎng)能容納多少主機(jī)-子網(wǎng)掩碼下最多可以容納多少個(gè)主機(jī)?
命名規(guī)范
text-overflow-文本溢出包含樣式設(shè)置
ES6入門之對(duì)象的新增方法
JS基礎(chǔ)知識(shí):變量對(duì)象、作用域鏈和閉包
更快助你弄懂React-高階組件
通俗易懂理解ES6 - ES6的變量類型及Iterator