

下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 24 章 selenium (待整理)第 24 章 selenium (待整理) 24.1. selenium 功能測(cè)試 24.1.1.概述 Selenium 是非常非常有用的, 對(duì) JavaScript 支持 良好的 Web層功能測(cè)試,集成測(cè)試工具。Selenium 分為 Core 與 RC(Remote Controll) 兩個(gè)部分,其中Core 是基礎(chǔ)的,直接在 HTML Table 里編寫測(cè)試代碼的模塊, 而Remote Controll 則支持用 Java 等語(yǔ)言編寫測(cè)試用例,并 自動(dòng)調(diào)用FireFox1.5 來(lái)運(yùn)行。具體的語(yǔ)法見/sele
2、nium-core/usage.html24.1.2. BetterPracticeNever use Selenium FIT modeSelenium 分為兩種運(yùn)行模式, Driven Mode( 現(xiàn)在叫 SeleniumRemote Control)和 FIT Mode(現(xiàn)在叫 Selenium Core)。FIT Mode 顧名思義, 就是類似 FIT Testing Framework 那種使 用方式, 主要用于 QA 等非技術(shù)人員編寫 Web 應(yīng)用的功能測(cè) 試FITMode 的 Selenium 測(cè)試使用 HTML 來(lái)組織測(cè)試用例。例如我要測(cè)試一個(gè) web 應(yīng)用的登陸功能。 我可能
3、寫出這樣的 HTML 表格。1< table >2< tr >3< td > open </ td >< td > http:/localhost:8080/login </ td>< td ></ td ></ tr >< tr >< td > type </ td &
4、;gt;< td > id=username </ td >< td > someuser </ td ></ tr >< tr >< td > type </ td >< td > id=password </ td >< td > password </ td &g
5、t;</ tr >< tr >< td > click </ td >< td > id=login_button </ td >< td ></ td ></ tr >< tr >< td > assertTextPresent </ td ><
6、td > Welcome to xxxx </ td >56789101112131415161718192021222324< td ></ td >26 </ tr >27 </ table >不同于 FIT , Selenium 內(nèi)置了一系列的命令,如上例中的 open, type,click 以及 assertTextPresen,t 因此 QA 可以完全拋開 DEV 獨(dú)立地編寫測(cè)試 (FIT 需要 DEV 提供 Behavior F
7、ixture) 。因此 FIT Mode是相當(dāng)容易使用的,哪怕不會(huì)使用 HTML 的 QA, 也可以使用FrontPage 畫出三列表格,依次填入數(shù)據(jù)。 然而對(duì)于大多數(shù) team 而言尤其是敏捷 team, FIT Mode 平易的外表下是令人恐懼的泥沼。大多數(shù)團(tuán)隊(duì)往往選擇使用 Selenium 作為功能測(cè)試和集成測(cè)試工具而不僅僅是 QA 測(cè)試 工具,在不同的迭代間遇到功能流程或 UI 變化時(shí),必須要 重構(gòu) Selenium 測(cè)試,或者說(shuō), Functional TestMigration 。令 人遺憾的是, HTML based 的 Selenium FIT Testing的重構(gòu)竟 然令人難
8、以置信的困難。我們可以使用 include 等Selenium FIT 擴(kuò)展,使得它可以重用詳細(xì)的功能( Log in , Log out諸如此類)。即便如此,在一個(gè)真實(shí)的項(xiàng)目中, Selenium Test 的數(shù)量往往在 200-500 之間 (我目前所處的項(xiàng)目在改用 Driven Mode 前已達(dá) 350+) ,對(duì)于這么大基數(shù)的 Selenium 測(cè)試,手 工重構(gòu)幾乎是不可想象的, 而目前尚沒(méi)有 HTML 代碼重構(gòu)工 具。即便存在泛泛意義上的 HTML 重構(gòu)工具, 對(duì)于 Selenium25測(cè)試重構(gòu)的有效性尚待商榷。而使用 Driven Mode 上述代碼 可以寫為 :1public vo
9、idtestShouldShowAWeclomeMessageAfterUserLoggedIn() 2selenium.open( http:/localhost:8080/login );3selenium.type( id=username , someuser );4selenium.type( id=password , password );5selenium.click( id=login_button );6assertTrue(selenium.isTextPresent( Welcome to xxxx );7 很自然,一個(gè)訓(xùn)練有素的程序員會(huì)重構(gòu)出如下代碼 :1public
10、 void login(String username, String password)2selenium.open( http:/localhost:8080/login );3selenium.type( id=username ,username);4selenium.type( id=password , password);5selenium.click( id=login_button );6 7public voidtestShouldShowAWeclomeMessageAfterUserLoggedIn() 9login( someuser , password );10a
11、ssertTrue(selenium.isTextPresent( Welcome to xxxx );11 之后無(wú)論是 pull up 到公共基類還是 extact 到 Utils class 都是 很容易的事情。由于 Java 在代碼重構(gòu)上便利,Java Selenium RemoteControl 成為使用 Selenium 的最佳方式。 在這一點(diǎn)上, 縱使 Ruby語(yǔ)法上比 Java 簡(jiǎn)單靈活得多,它仍不是編寫 Selenium 測(cè)試的最佳載體 (當(dāng)然一個(gè)經(jīng)過(guò)精心設(shè)計(jì)的rubyselenium dsl wrapper 還是具有非凡的價(jià)值的,這個(gè)我們后面 會(huì)涉及到 )。 24.1.3.
12、Using the name user, system, page instead ofselenium 觀察上面提到的代碼, 其中使用 selenium 來(lái)操縱 web 應(yīng)用的行為,這在 Remote Control 里是常見的做法,但是仍 然不夠好,我們可以做一些小的變化以得到更好的測(cè)試 :1protected void setup() 2selenium =/ intialize selenium instance3user = selenium;4currentPage = selenium;5 public void login(String username, String pas
13、sword)8user.open( http:/localhost:8080/login );9user.type( id=username ,username);10user.type( id=password , password);11user.click( id=login_button );12 1314public voidtestShouldShowAWeclomeMessageAfterUserLoggedIn() 15login( some guy , password );16assertTrue(currentPage.isTextPresent( Welcome tox
14、xxx );17 基本上這只不過(guò)是 另一種寫法 而已,但是它更好的表達(dá)了 用戶的行為 ,如 login 代碼所示。以及 系統(tǒng)的正確相應(yīng) , 即currentPage.isTextPresent()。這種是典型的對(duì)編譯器無(wú)意義 對(duì)人有意義的代碼,也就是普遍意義上好的代碼。 24.1.4.Creating a DSL base on your test codes 懂得 HTML 的 QA 可以 在沒(méi)有 DEV 的幫助下使用 Selenium FIT mode ,然而卻不能 在沒(méi)有DEV 的幫助下使用 Driven Mode 。于是最自然也是最 fashion 的做法,就是在已有的 test co
15、des 之上提供 Testing DSL 或者 ScriptingLanguage ,讓 FIT mode 變得更加 FIT 。這方面 內(nèi)容是一個(gè)更大的主題, 以后再詳細(xì)展開吧。 24.1.5. Hacking Selenium Object tosupport FIT commandSelenium FIT mode 和 RC mode 下的命令有些許差異,比如 FIT 中的 assertTextPresent 在 RC 中變成了isTextPresent。同樣還有 FIT 中最實(shí)用的命令 clickAndWait ,在 RC中變成了 click 和 waitForPageToLoad。在
16、RC 中使用 FIT mode 中的命令也非難 事,找到 com.thoughtworks.selenium.Selenium ,添加方法 : public void doCommand(String commmand, Stringparameters);然后在 com.thoughtworks.selenium.DefaultSelenium 中添加實(shí) 現(xiàn):1public void doCommand(String commmand, String parameters)2String paras = new String , , 3for ( int i =0 ; i <
17、parameters.length&& i < 3 ; i + )4parasi = parametersi;5commandProcessor.doCommand(command, paras);然后試驗(yàn)一下 : selenium.doCommand( clickAndWait );在我們使用純 RC mode 之前曾經(jīng)用過(guò)一段中間方案,將 rc code 轉(zhuǎn)化為 fit code 來(lái)跑(因?yàn)?rc 不支持 https), 由于不是真 正的 rc mode,像 isTextPresent 之類的方法都沒(méi)有辦法使用, 只能使用 FIT modeco
18、mmand 。因此如果因?yàn)橐恍┨厥獾脑?(https, chrome 起不來(lái),hta bug 多等等 ),你沒(méi)有辦法使用 RC mode,但是有希望得到RC 可重構(gòu)的好處,那么這個(gè)tricky的技巧倒是不錯(cuò)的選擇。 24.1.6. Using chrome and IE hta lanucherto support https24.1.7. Run test using different browser lanucher totest browser compatibility 這兩個(gè)都是和 browser lanucher 相關(guān)的,Selenium 和 JWebUnit 最大的不同在于它
19、使 用真實(shí)的瀏覽器來(lái)跑測(cè)試,從而可以更加真實(shí)地考察系統(tǒng)在 不同瀏覽器中的表現(xiàn)。因此使用不同的瀏覽器lanucher 來(lái)運(yùn)行測(cè)試, 可以更好測(cè)試應(yīng)用的瀏覽器兼容性, 這對(duì)于 web 2.0 應(yīng)用而言是很有幫助的。此外,使用rc 提供的試驗(yàn)性lanucher, chrome 和 hta 可以解決跨 domain 測(cè)試和 https 的問(wèn) 題。不過(guò)目前 hta 還是有很多 bug 的,推薦使用 chrome。當(dāng) 然,最希望的還是澳洲的同事可以早日在 selenium 里提供https 支持。 24.2. Selenium 指南網(wǎng)站: 國(guó)內(nèi)大部分公司還依靠 Q
20、A 組的 MM 看著測(cè)試用例 Word 文 檔來(lái)手工測(cè)試。如果錢人有限,又想改變現(xiàn)狀,最實(shí)在的自 動(dòng)化測(cè)試建議是先編寫直接訪問(wèn)數(shù)據(jù)庫(kù)的商業(yè)層單元測(cè)試 用例和 基于 Selenium 的集成測(cè)試用例。在徐昊指導(dǎo)下, SpringSide2.0 已經(jīng)全面應(yīng)用 Selenium 。 Selenium能被選為最好集成測(cè)試、回歸測(cè)試方案的原因是: Selenium IDE ,一個(gè) FireFox plugin ,能自動(dòng)記錄用戶的操作, 生成測(cè)試腳本。生成的測(cè)試腳本可以用 Selenium Core 手工執(zhí)行,也能基于Selenium RC 放入 Java,C#,Ruby 的單元測(cè)試用例中自動(dòng)運(yùn) 行。測(cè)試
21、用例調(diào)用實(shí)際的瀏覽器 (如 IE、FireFox) 來(lái)執(zhí)行測(cè)試。和 有些開源方案自行實(shí)現(xiàn) Web 解釋引擎相比, 實(shí)際的瀏覽器能 模擬更多用戶交互和 JS 語(yǔ)法,順便還可以測(cè)試各瀏覽器兼容 性。測(cè)試腳本語(yǔ)法非常簡(jiǎn)單,見后。 24.2.1. 使用 Selenium IDE 生成腳本 Selenium IDE 是一個(gè) Firefox1.5 插件,下載后用 Firefox 將其打開。工具 ->Selenium IDE ,點(diǎn)擊紅色的 recorder 按鈕開始錄制, 在網(wǎng)站中亂點(diǎn)時(shí)可以即時(shí)看到每個(gè)動(dòng)作的腳本。切換 Format :顯示 HTML , Java, C#, Ruby 語(yǔ)法的腳
22、本。 option里還可以設(shè)定 Java 里 Selenium 變量的名稱,如設(shè)為 user,使腳本顯示為 user.input(name,foo);user.type(addButton) ,閱讀比較自 然。 24.2.2. 測(cè)試用例與測(cè)試腳本 public class UserManagerTestextends TestCaseprivate Selenium user; public void setUp() throws Exception user = new DefaultSelenium( localhost ,SeleniumServer.DEFAULT_PORT, *iex
23、plore ,http:/localhost:8080 );user.start(); protected void tearDown() throws Exception user.stop();public void testUserEdit() user.open( /helloworld );user.click( /acontains(href, user.do?id=0) );user.waitForPageToLoad( 3000 );user.type( , calvin );user.click( save );user.waitForPageToLoad
24、( 3000 );assertTrue(user.isTextPresent( calvin );留意 setUp 中的 *iexplore 參數(shù),設(shè)定使用 IE 作為測(cè)試瀏覽 器;如果設(shè)為 *firefox ,就會(huì)在 PATH 中查找 *firefox.exe 。 注意,Selenium 使用 IE 時(shí)的 Proxy 機(jī)制比較特殊, 如果你同 時(shí)在本機(jī)ADSL modem 撥號(hào)上網(wǎng), 要先斷網(wǎng)。腳本中按徐昊的指導(dǎo), 使用 user作為 Selenium 的變量名, 使用例更加易讀。Selenium RC 里并沒(méi)有為 Java 單列一個(gè)函數(shù)參考手冊(cè),需要 閱讀公共的 Selenium Refr
25、ences,再使用同名對(duì)應(yīng)的java 函數(shù)。所有函數(shù)都有一個(gè) locator 參數(shù),將操作付諸某個(gè)頁(yè)面上的對(duì) 象。支持 ID , DOM 語(yǔ)法,XPath 語(yǔ)法,CSS selector 語(yǔ)法等, 詳見參考手冊(cè)。如果不會(huì)寫,最好的老師就是 Selenium IDE 。比如那句點(diǎn)擊<a href=user.do?id=0 />修改</a>,就是用 IDE 得 到user.click(/acontains(href, user.do?id=0) 的 XPath 語(yǔ) 句。24.2.3. Ant 的運(yùn)行腳本我寫的 Ant 測(cè)試腳本一個(gè)重要特 征是
26、使用<parallel> 并行容器節(jié)點(diǎn),一邊同時(shí)打開tomcat 和 selenium server, 邊等待兩者打開后執(zhí)行JUnit測(cè)試。如果不使用并行節(jié)點(diǎn),而是用 spawn=yes 屬性后臺(tái)啟動(dòng)tomcat,則屏幕里看不到 tomcat 信息,如果測(cè)試意外終止的 話,也不能關(guān)閉 tomcat。< parallel >< antcalltarget =tomcat.start />< antcalltarget =selenium.server.start /><
27、sequential >< waitfor maxwait =10 maxwaitunit =minutecheckevery =1 checkeveryunit =second >< http url =http:/localhost:8080/></waitfor >< waitfor maxwait =10 maxwaitunit =minutecheckevery =1 checkeveryunit =second >< socket server
28、 =localhost port =4444 /></ waitfor >< junit . />< antcall target =tomcat.stop /></ sequential ></ parallel >24.2.4. SpringSide 中的 FunctionalTestCase 基類SpringSide 中抽象了一個(gè) FunctionalTestCase 基類,抽取 了setUp() , tearDown() 函數(shù)中 se
29、lenium server 開閉操作。 其中瀏覽器類型默認(rèn)為 *iexplore, 基本 url 默認(rèn)為 http:/localhost:8080 用戶可以在 Classpath 根目錄中放置 perties 文 件,重新設(shè)定 selenium.explorer 和 selenium.baseurl 變量。 24.3. Selenium 測(cè)試 Ajax 項(xiàng)目 24.3.1. 匆匆一瞥 Selenium 在典型 的在線商店中,需要用戶輸入或選擇眾多步驟后才可以完成 整個(gè)購(gòu)物流程。作為 web應(yīng)用的開發(fā)者,你如何保證你程序 的質(zhì)量和正確性呢?如果能有辦法測(cè)試你功能的正確性,
30、那 問(wèn)題就迎刃而解了,但如何做到呢 ?Selenium 是一個(gè)由 ThoughtWorks 做的專門為 web 應(yīng)用所做 的非常有效的功能測(cè)試工具。 Selenium 的 tests 直接在瀏覽 器里跑,就像用戶真的在操作一樣。 Selenium 可運(yùn)行 Windows, Linux, 和Macintosh 的各種瀏覽器, 如 Internet Explorer, Mozilla 和 Firefox 。看看 Selenium 的 online demo 。點(diǎn)擊右上角的 All 按鈕來(lái) 啟動(dòng)運(yùn)行 test cases,如無(wú)意其外,你將看到所有都是綠行。注意 action的綠色是會(huì)比 assert
31、ions 淺的,這是因?yàn)樗麄儨y(cè)試 的所有東西都只是 verify 或 assert 命令。如果有一個(gè) assertion 失敗了,則那行命令會(huì)變?yōu)榧t色,并且 Selenium 會(huì)停止運(yùn) 行。如果 verify 命令失敗了,那行命令也會(huì)變?yōu)榧t色,但是 不會(huì)讓測(cè)試停下來(lái)。在 Selenium 中的 Test suites 和 cases 實(shí)際上是由 HTML寫成的, 它們只是很簡(jiǎn)單的 HTML <table>s 。 test suite 中沒(méi)行都只是關(guān)聯(lián)了一個(gè) test case, 例如: <tr><td>&
32、;lt;ahref=MyTest.html >MyTest</a></td></tr>test-case 實(shí)際上是由 Selenese 寫成的 HTML 文檔,里面 包有一個(gè) table,3 個(gè)列,所有的命令最多只有兩個(gè)參數(shù),所 以足夠位置擺放。一個(gè)典型的test case 像這樣:當(dāng)你開始運(yùn)行測(cè)試(例如 按 All 按鈕), Selenium 的TestRunner 會(huì)自動(dòng)解釋 HTML 格式的 test-case, 并運(yùn)行你 的 web應(yīng)用,并在頁(yè)面下方的框架中顯示運(yùn)行的情形。 Seleniu
33、m 允許你通過(guò)在瀏覽器里模擬用戶的行為來(lái)進(jìn)行測(cè) 試。這當(dāng)然不代表它可以代替 unit-testing ,只是我們通常會(huì) 用它來(lái)進(jìn)行 web 應(yīng)用的功能測(cè)試。它也可以被加入持續(xù)繼承 測(cè)試 (continuous-integration) 中,作為常規(guī)的自動(dòng)回歸測(cè)試 (regression testing)。 如果想更深入了解 Selenium,請(qǐng)參看在 線文檔 Selenium: Usage.24.3.2. 開始測(cè)試 Ajax 在你的web 應(yīng)用功能是用 JavaScript 實(shí)現(xiàn)時(shí), Selenium 就顯得極為 有用了。Ajax, 是 Asynchronous JavaScript and
34、XML 的簡(jiǎn)稱,是 web 應(yīng)用中的一種 web 交互技術(shù)。它可以實(shí)現(xiàn)在頁(yè)面不需要刷新的情況下,在后臺(tái)與服務(wù)器交互少量數(shù)據(jù),并即時(shí)改變頁(yè)面 內(nèi)容。這意味著網(wǎng)頁(yè)看起來(lái)更實(shí)時(shí),更有動(dòng)態(tài)和更實(shí)用。 24.3.3. Ajax 中指示正在 讀取數(shù)據(jù) 的標(biāo)簽剛才那句話是對(duì) Ajax 的技術(shù)定義, 對(duì)于我們大多數(shù)人來(lái)說(shuō), Ajax 意味著頁(yè)面 向 GMail 或 Flickr 那樣。當(dāng)你點(diǎn)一個(gè)連接時(shí),它不會(huì)產(chǎn)生 頁(yè)面刷新,而是頁(yè)面會(huì)和服務(wù)器交互后返回來(lái)再更改一部分 頁(yè)面。在點(diǎn)擊連接和看到結(jié)果之間延遲的這段時(shí)間,讓測(cè)試 看起來(lái)那么的棘手。 讓我們來(lái)假設(shè)我們的頁(yè)面包含了一個(gè) text field 和一個(gè) but
35、ton。text field 的初始值是 oldValue。如果你點(diǎn)擊 button , Ajax 就會(huì)啟動(dòng),并把 text field 的值改為newValue, 而沒(méi)有 刷新任何頁(yè)面。那我們?cè)趺慈y(cè)試它呢? 你會(huì)很自然的去 打開頁(yè)面, 點(diǎn)擊 button, 然后檢查 text field 。但是你在 Selenium 中的這個(gè) test case 失敗了! 測(cè)試失敗的原因也許并不明顯。 這個(gè)意外的發(fā)生是因?yàn)?Ajax 的異步性,它并不會(huì)馬上從服務(wù)器上得到結(jié)果。所以當(dāng)你按 下 button 時(shí), Selenium 就開始馬上檢查是否有改變值。 Selenium 并不知道需要去等待結(jié)果。 那我
36、們?nèi)绾稳プ屵@個(gè)測(cè) 試在 Ajax 下生效呢? 我們?nèi)绾稳プ?Selenium 等待返回的結(jié)果呢? 有些人認(rèn)為解 決這個(gè)問(wèn)題的辦法是用 clickAndWait命令來(lái)代替 click 命 令;但是在使用以 AndWait 為后序的命令時(shí),Selenium 會(huì) 等待頁(yè)面刷新。但是明顯的,頁(yè)面不會(huì)刷新,這樣就使得Selenium 永遠(yuǎn)在等待了。明顯這個(gè)方法行不通。 另外一個(gè)方法是在click 和 assertValue 之間加入暫停時(shí) 間。讓它暫停 5 秒,讓服務(wù)器有足夠的時(shí)間返回相應(yīng)。這種 方法在大多數(shù)時(shí)候是可行的,但是如果服務(wù)器相應(yīng)時(shí)間大于 5 秒,如網(wǎng)速很慢,測(cè)試機(jī)重啟等的時(shí)候,就會(huì)失敗了。你
37、 或許會(huì)加大等待時(shí)間來(lái)保證更正確,但是這樣明顯會(huì)使得你 的測(cè)試越來(lái)越慢。所以明顯的這個(gè)辦法并沒(méi)有按需而慢下拉,所以這也不是最佳的解決辦法。幸運(yùn)的是, Selenium 現(xiàn)在已經(jīng)提供了這種我們非常需要的技 術(shù)支持。當(dāng) field 的值在單前頁(yè)面改變時(shí),你能用 waitForValue 命令去讓Selenium 等待到這個(gè)期望值出現(xiàn)為 止。所以為了讓剛才的失敗的測(cè)試通過(guò),你需要把它其中的 assertValue命令改變?nèi)缦拢寒?dāng)執(zhí)行這個(gè)命令的時(shí)候 , Selenium 會(huì)暫停執(zhí)行當(dāng)前的 test case 和等待所期待的值。當(dāng)新的值 newValue 出現(xiàn)在 text field 時(shí), 測(cè)試再次開始
38、。但你需要注意的是,如果你寫錯(cuò) 期望值了,那 Selenium將會(huì)等待這個(gè)值 30 分鐘。 就如你想到的那樣, Selenium 已經(jīng)提供了很多測(cè)試 Ajax 效 果的命令。例如,如果你想等待某些文本會(huì)在頁(yè)面上出現(xiàn), 那你可用 waitForText 命令 ; 如果你想檢查當(dāng)前頁(yè)面的 Title 是 否有改變,則用 waitForTitle; 如果你想檢查某個(gè) HTML 元素是否有在頁(yè)面中被移除,應(yīng)用 waitForElementNotPresent 命令。實(shí)際上,對(duì)于每個(gè) Selenium Accessor, 都會(huì)有相應(yīng)的 waitForXxxx和 waitForNotXxxx 命令。當(dāng)你用
39、 verifyXxxx or assertXxxx 去檢查某些東西時(shí), 總可以有 waitForXxxx 去 測(cè)試異步效果。如果預(yù)先確定了 waitForXxxx 和 waitForNotXxxx 命令但 又達(dá)不到預(yù)期,那會(huì)怎樣呢? 對(duì)于這種情況,我們有 waitForCondition 命令去指定一個(gè) Javascript 的真假表達(dá)式 (Boolean expression) , 然Selenium 去等待表達(dá)式的值為 true 為止。 waitForCondition 命令的格式是 waitForCondition script timeout (in ms) 這樣在測(cè)試復(fù)雜的Ajax
40、效果時(shí)就更為便捷了。 實(shí)際上如果你深入研究 Selenium 的source code 的話, 你 會(huì)發(fā)現(xiàn)所有前序?yàn)?waitForXxxx 和waitForNotXxxx 的命 令都是繼承了 waitForCondition 的。 GrigGheorghiu 寫了一 篇關(guān)于這方面的 blog: Ajax testing with Seleniumusing waitForCondition. 當(dāng)他寫這篇文章時(shí),waitForCondition 僅 僅是用戶自己擴(kuò)展 Selenium, 現(xiàn)在已經(jīng)成為 Selenium 核心 代碼的一部分了。 24.3.4. 總結(jié)在這篇簡(jiǎn)短的文章中, 我們 介紹
41、了Selenium ,一個(gè) web 應(yīng)用測(cè)試工具。同樣地,我們也 討論了如何去用 waitForXxxx 命令來(lái)測(cè)試 Ajax 應(yīng)用,也演 示了如何用 Selenium去測(cè)試一些 Ajax 異步效果。 如果你想知道更多有關(guān)于 waitForXxxx命令, Selenium 的 開發(fā)者提供了一些簡(jiǎn)單的測(cè)試?yán)?演示了如何測(cè)試 Ajax , 如編輯替換,自動(dòng)填充和拖拉效果等。這些例子是基于script.aculo.us, 來(lái)做的, 它是大家都非常熟悉的 Ajax library-prototype.js 的子項(xiàng)目。(自 http:/ , cac 譯。注:之前也翻譯了一篇很詳細(xì)的 Selenium
42、文檔, 見 Selenium 中文手冊(cè) :http:/ )24.4. selenium 中文手冊(cè) 24.4.1. Commands ( 命令 )Action對(duì)當(dāng)前狀態(tài)進(jìn)行操作 失敗時(shí),停止測(cè)試Assertion 校驗(yàn)是否有產(chǎn)生正確的值Element Locators指定 HTML 中的某元素Patterns用于模式匹配 . Element Locators ( 元素定位器 )id=id idlocator 指定 HTML 中的唯一 id 的元素name=namename locator 指定 HTML 中相同 name 的元素中的第一個(gè)元 素identifier=idident
43、ifier locator 首先查找 HTML 是否存在該 id 的元素 , 若 不存在,查找第一個(gè)該 name 的元素dom=javascriptExpressiondom locator 用 JavaScript 表達(dá)式來(lái)定位 HTML 中的元素 ,注意 必須要以 document 開頭例如:dom=document.formsmyForm.myDropdowndom=document.images56xpath=xpathExpressionxpath locator 用 XPath 表達(dá)式來(lái)定位 HTML 中的元素 ,必須 注意要以 / 開頭例如:xpath=/imgalt=The i
44、mage alt textxpath=/tableid=table1/tr4/td2 link=textPatternlink locator 用 link 來(lái)選擇 HTML 中的連接或錨元素例如:在沒(méi)有 locator 前序的情況下 Without a locator prefix,Selenium uses:如果以 document. 開頭,則默認(rèn)是使用 dom locator ,如果是 以/ 開頭,則默認(rèn)使用 xpath locator, 其余情況均認(rèn)作 identifierlocator. String Matching Patterns ( 字符串匹 配模式 )glo
45、b:patthernglob 模式,用通配符 * 代表任意長(zhǎng)度字符, ? 代表一個(gè)字 符regexp:regexp正則表達(dá)式模式,用 JavaScript 正則表達(dá)式的形式匹配字符 串exact:string 精確匹配模式,精確匹配整個(gè)字符串,不能用通配符 在沒(méi)有指定字符串匹配前序的時(shí)候, selenium 默認(rèn)使用 golb 匹配模式 . Select Option Specifiers (Select 選項(xiàng)指定器)label=labelPattern通過(guò)匹配選項(xiàng)中的文本指定選項(xiàng)例如:label=regexp:AOothervalue=valuePattern通過(guò)匹配選項(xiàng)中的
46、值指定選項(xiàng)例如: value=other通過(guò)匹配選項(xiàng)的 id 指定選項(xiàng)例如:id=option1index=index通過(guò)匹配選項(xiàng)的序號(hào)指定選項(xiàng),序號(hào)從 0 開始例如: index=2在沒(méi)有選項(xiàng)選擇前序的情況下,默認(rèn)是匹配選項(xiàng)的文本24.4.2. Actions 描述了用戶所會(huì)作出的操作。Action 有兩種形式:action 和 actionAndWait, action 會(huì)立即執(zhí) 行,而 actionAndWait 會(huì)假設(shè)需要較長(zhǎng)時(shí)間才能得到該 action 的相響,而作出等待,open 則是會(huì)自動(dòng)處理等待時(shí)間。24.421.clickclick(elementLocator)點(diǎn)擊連接 ,
47、按鈕,復(fù)選和單選框 如果點(diǎn)擊后需要等待響應(yīng),則用clickAndWait 如果是需要經(jīng)過(guò) JavaScript 的 alert 或 confirm 對(duì)話框后才能 繼續(xù)操作,則需要調(diào)用verify或 assert來(lái)告訴 Selenium你期望對(duì)對(duì)話框進(jìn)行什么操作。click - aCheckboxclickAndWait - submitButtonclickAndWait - anyLink . openopen(url) 在瀏覽器中打開URL, 可以接受相對(duì)和絕對(duì)路徑兩種形式 注意:該 URL 必須在與瀏覽器相同的安全限定范圍之內(nèi) open - /mypageopen - h
48、ttp:/localhost/. typetype(inputLocator, value) 模擬人手的輸入過(guò)程,往指定的 input 中輸入值 也適合給復(fù)選和單選框賦值在這個(gè)例子中,則只是給鉤選了的復(fù)選框賦值,注意,而不 是改寫其文本type - nameField - John SmithtypeAndWait - textBoxThatSubmitsOnChange -newValue. selectselect(dropDownLocator, optionSpecifier)根據(jù) optionSpecifier 選項(xiàng)選擇器來(lái)選擇一個(gè)下拉菜單選項(xiàng)如果有多
49、于一個(gè)選擇器的時(shí)候,如在用通配符模式, 女如 f*b*, 或者超過(guò)一個(gè)選項(xiàng)有相同的文本或值,則會(huì)選擇第一個(gè)匹配 到的值select - dropDown - Australian Dollars select - dropDown - index=0selectAndWait - currencySelector - value=AUD selectAndWait -currencySelector - label=Auslian D*rs .goBack,closegoBack() 模擬點(diǎn)擊瀏覽器的后退按鈕 close()模擬點(diǎn)擊瀏覽器關(guān)閉按鈕 . selec
50、tWindowselect(windowId)選擇一個(gè)彈出窗口 當(dāng)選中那個(gè)窗口的時(shí)候,所有的命令將會(huì)轉(zhuǎn)移到那窗口中執(zhí) 行selectWindow - myPopupWindow selectWindow - null .pausepause(millisenconds) 根據(jù)指定時(shí)間暫停 Selenium 腳本執(zhí)行常用在調(diào)試腳本或等待服務(wù)器段響應(yīng)時(shí) pause - 5000pause - 2000 .fireEventfireEvent(elementLocatore,evenName) 模擬頁(yè)面元素事件被激活的處理動(dòng)作fireEvent - textField
51、 - focus fireEvent - dropDown - blur .waitForConditionwaitForCondition(JavaScriptSnippet,time) 在限定時(shí)間內(nèi),等待一段 JavaScript 代碼返回 true 值,超時(shí) 則停止等待waitForCondition - var value=selenium.getText(foo);value.match(/bar/); - 3000 0.waitForValuewaitForValue(inputLocator, value) 等待某 input(如hidden in
52、put)被賦予某值,會(huì)輪流檢測(cè)該值,所以要注意如果該值長(zhǎng)時(shí)間一直不賦予該 input 該值的話,可能會(huì)導(dǎo)致阻塞waitForValue - finishIndication - isfinished 1.store,stroreValuestore(valueToStore, variablename) 保存一個(gè)值到變量里。該值可以由自其他變量組合而成或通過(guò) JavaScript 表達(dá)式賦 值給變量store - Mr John Smith - fullnamestore - $. title $. firstname$. suname- fullnamestore - jav
53、ascript. Math.round(Math.PI*100)/100 - PI storeValue -inputLocator - variableName把指定的 input 中的值保存到變量中storeValue - userName - userIDtype - userName - $. userID2. storeText,storeAttributestoreText(elementLocator, variablename) 把指定元素的文本值賦予給變量storeText - currentDate - expectedStartDateverifyValu
54、e - startDate - $. expectedStartDate3.storeAttribute(. elementLocatorattributeName,variableName.)把指定元素的屬性的值賦予給變量storeAttribute input1class classOfInput1verifyAttribute input2class $. classOflnput1 4.chooseCancel., answer.chooseCancelOnNextConfirmation() 當(dāng)下次 JavaScript 彈出 confirm 對(duì)話框的
55、時(shí)候 ,讓 selenium 選 擇 Cancel如果沒(méi)有該命令時(shí),遇到 confirm 對(duì)話框 Selenium 默認(rèn)返回 true,如手動(dòng)選擇 OK 按鈕一樣chooseCancelOnNextConfirmation 如果已經(jīng)運(yùn)行過(guò)該命令,當(dāng)下一次又有 confirm 對(duì)話框出現(xiàn) 時(shí),也會(huì)同樣地再次選擇 CancelanswerOnNextPrompt(answerString)在下次 JavaScript 彈出 prompt 提示框時(shí),賦予其 anweerString 的值,并選擇確定answerOnNextPrompt Kangaroo 24.4.3. Assertions 允許用戶
56、去 檢查當(dāng)前狀態(tài)。兩種模式:Assert 和 Verify,當(dāng) Assert 失敗, 則退出測(cè)試;當(dāng) Verify 失敗,測(cè)試會(huì)繼續(xù)運(yùn)行。 . assertLocation,assertTitleassertLocation(relativeLocation) 判斷當(dāng)前是在正確的頁(yè)面 verifyLocation /mypage assertLocation /mypage .assertTitle(titlePattern) 檢查當(dāng) 前頁(yè)面的 title 是否正確 verifyTitle MyPage assertTitle My Page .
57、assertValueassertValue(inputLocator, valuePattern)檢查 input 的值對(duì)于 checkbox 或 radio,如果已選擇,則值為on,反之為offverifyValue nameField John SmithassertValue Field John Smith .assertSelected,assertSelectedOptionsassertSelected(selectLocator,optionSpecifier)檢查 select 的下拉菜單中選中的選型是否和option
58、Specifer(Select 選擇選項(xiàng)器 )的選項(xiàng)相同verifySelected dropdown2 John SmithverifySelected dorpdown2 value=js*123assertSelected document.forms2.dropDown label=J*SmithassertSelected document.forms2.dropDown index=0.assertSelectOptions(selectLocator, optionLabelList) 檢查下拉菜 單中的選項(xiàng)的文本是否和 optionLabelList 相同opt
59、ionLabelList 是以逗號(hào)分割的一個(gè)字符串 verifySelectOptionsdropdown2 John Smith,Dave Bird assertSelectOptionsdocument.forms2.dropdown Smith,J,Bird,D.assertTextassertText(elementLocator,textPattern) 檢查指定元素的文本 只對(duì)有包含文本的元素生效對(duì)于 Mozilla 類型的瀏覽器,用 textContent 取元素的文本, 對(duì)于 IE類型的瀏覽器,用 innerText 取元素文本 verifyText statu
60、sMessageSuccessful assertText /divid=foo/h1 Successful .assertAttribute(. elementLocatorattributeName. ,ValuePattern)檢查當(dāng)前指定元素的屬性的值 verifyAttributetxt1class bigAndBlod assertAttribute document.images0altalt-text verifyAttribute /imgid=foo/alt alt-text .assertTextPresent, etc.assertTex
61、tPresent(text)assertTextNotPresent(text) assertElementPresent(elementLocator)verifyElementPresent submitButton assertElementPresent/imgalt=foo assertElementNotPresent(elementLocator).assertTableassertTable(cellAddress, valuePattern) 檢查 table 里的某個(gè) cell 中的值 cellAddress 的語(yǔ)法是 tableName.row.column, 注意行列序號(hào) 都是從 0 開始 verifyTable myTable.1.6 SubmittedassertTable results0.2 13 0. assertVisible,nonVisibleassertVisible(elementLocator) 檢查指定的元素是否可視的隱藏一個(gè)元素可以用設(shè)置css 的visibility屬性為hidden,也可以
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度門面房出租與租賃期限調(diào)整合同
- 二零二五年度診所負(fù)責(zé)人安全責(zé)任免除合同
- 服務(wù)器采購(gòu)合同共
- 無(wú)人機(jī)研發(fā)制造投資合同
- 水利設(shè)施施工合同
- 高考語(yǔ)文復(fù)習(xí)-文言文專題訓(xùn)練-《遼史》
- 高考語(yǔ)文復(fù)習(xí):文言文霍去病專練
- 農(nóng)業(yè)產(chǎn)業(yè)孵化項(xiàng)目合作協(xié)議書
- 業(yè)務(wù)流程外包服務(wù)協(xié)議內(nèi)容詳訂
- 數(shù)字媒體設(shè)計(jì)技能考核點(diǎn)
- 初中數(shù)學(xué)幾何《旋轉(zhuǎn)模型費(fèi)馬點(diǎn)》壓軸題含答案解析
- 2025年中國(guó)中信集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 江西省宜春市豐城市第九中學(xué)2024-2025學(xué)年九年級(jí)上學(xué)期第二次段考化學(xué)試卷(日新班)(無(wú)答案)
- 燃?xì)夤景踩a(chǎn)實(shí)施方案
- 【MOOC】涂附磨具-河南工業(yè)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024解析:第十四章內(nèi)能的利用-基礎(chǔ)練(解析版)
- 2024年湖南省初中學(xué)業(yè)水平考試·數(shù)學(xué)
- 機(jī)電設(shè)備安裝與調(diào)試技術(shù)教案
- TGDCMA 022-2024 信用園區(qū)評(píng)價(jià)規(guī)范
- 以諾書-中英對(duì)照
- 2024年中職高考數(shù)學(xué)計(jì)算訓(xùn)練 專題11 平面向量的基本計(jì)算(含答案解析)
評(píng)論
0/150
提交評(píng)論