1. Never use Selenium FIT mode
Selenium分為兩種運行模式,Driven Mode(現在叫Selenium Remote Control)和FIT Mode(現在叫Selenium Core)。
FIT Mode顧名思義,就是類似FIT Testing Framework那種使用方式,主要用于QA等非技術人員編寫Web應用的功能測試。FIT Mode的Selenium測試使用HTML來組織測試用例。例如我要測試一個web應用的登陸功能。我可能寫出這樣的HTML 表格。

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

不同于FIT,Selenium內置了一系列的命令,如上例中的open, type, click以及assertTextPresent,因此QA可以完全拋開DEV獨立地編寫測試(FIT需要DEV提供Behavior Fixture)。因此FIT Mode是相當容易使用的,哪怕不會使用HTML的QA,也可以使用FrontPage畫出三列表格,依次填入數據。
然而對于大多數team而言——尤其是敏捷team,FIT Mode平易的外表下是令人恐懼的泥沼。大多數團隊往往選擇使用Selenium作為功能測試和集成測試工具而不僅僅是QA測試工具,在不同的迭代間遇到功能流程或UI變化時,必須要重構Selenium測試,或者說,Functional Test Migration。令人遺憾的是,HTML based的Selenium FIT Testing的重構竟然令人難以置信的困難。我們可以使用include等Selenium FIT擴展,使得它可以重用詳細的功能(Log in, Log out諸如此類)。即便如此,在一個真實的項目中,Selenium Test的數量往往在200-500之間(我目前所處的項目在改用Driven Mode前已達350+),對于這么大基數的Selenium測試,手工重構幾乎是不可想象的,而目前尚沒有HTML代碼重構工具。即便存在泛泛意義上的HTML重構工具,對于Selenium測試重構的有效性尚待商榷。而使用Driven Mode上述代碼可以寫為:



2

3

4

5

6

7

很自然,一個訓練有素的程序員會重構出如下代碼:



?2

?3

?4

?5

?6

?7

?8



?9

10

11

之后無論是pull up到公共基類還是extact到Utils class都是很容易的事情。由于Java在代碼重構上便利,Java Selenium Remote Control成為使用Selenium的最佳方式。在這一點上,縱使Ruby語法上比Java簡單靈活得多,它仍不是編寫Selenium測試的最佳載體(當然一個經過精心設計的ruby selenium dsl wrapper還是具有非凡的價值的,這個我們后面會涉及到)。
2. Using the name user, system, page instead of selenium
觀察上面提到的代碼,其中使用selenium來操縱web應用的行為,這在Remote Control里是常見的做法,但是仍然不夠好,我們可以做一些小的變化以得到更好的測試:



?2



?3

?4

?5

?6

?7



?8

?9

10

11

12

13

14



15

16

17

基本上這只不過是"另一種寫法"而已,但是它更好的表達了"用戶的行為",如login代碼所示。以及"系統的正確相應",即currentPage.isTextPresent()。這種是典型的對編譯器無意義對人有意義的代碼,也就是普遍意義上好的代碼。
3. Creating a DSL base on your test codes
懂得HTML的QA可以在沒有DEV的幫助下使用Selenium FIT mode,然而卻不能在沒有DEV的幫助下使用Driven Mode。于是最自然也是最fashion的做法,就是在已有的test codes之上提供Testing DSL或者Scripting Language,讓FIT mode變得更加FIT。這方面內容是一個更大的主題,以后再詳細展開吧。
4. Hacking Selenium Object to support FIT command
Selenium FIT mode和RC mode下的命令有些許差異,比如FIT中的assertTextPresent,在RC中變成了isTextPresent。同樣還有FIT中最實用的命令clickAndWait,在RC中變成了click和waitForPageToLoad。在RC中使用FIT mode中的命令也非難事,找到com.thoughtworks.selenium.Selenium,添加方法:


然后在com.thoughtworks.selenium.DefaultSelenium中添加實現:




2



3

4

5

6

然后試驗一下:

在我們使用純RC mode之前曾經用過一段中間方案,將rc code轉化為fit code來跑(因為rc不支持https),由于不是真正的rc mode,像isTextPresent之類的方法都沒有辦法使用,只能使用FIT mode command。因此如果因為一些特殊的原因(https, chrome起不來,hta bug多等等),你沒有辦法使用RC mode,但是有希望得到RC可重構的好處,那么這個tricky的技巧倒是不錯的選擇。
5. Using chrome and IE hta lanucher to support https
6. Run test using different browser lanucher to test browser compatibility
這兩個都是和browser lanucher相關的,Selenium和JWebUnit最大的不同在于它使用真實的瀏覽器來跑測試,從而可以更加真實地考察系統在不同瀏覽器中的表現。因此使用不同的瀏覽器lanucher來運行測試,可以更好測試應用的瀏覽器兼容性,這對于web 2.0應用而言是很有幫助的。此外,使用rc提供的試驗性lanucher,chrome和hta可以解決跨domain測試和https的問題。不過目前hta還是有很多bug的,推薦使用chrome。當然,最希望的還是澳洲的同事可以早日在selenium里提供https支持。
core的最糟處,個人認為是缺少對測試腳本流程的控制,因為它不具備選擇,判斷,循環等機制。但也并非是'never use selenium core'。
能否對此最一些詳細的說明??
謝謝!
還有個疑問:看sourceforge 上的文章,說Selenium是支持SAFS。這在應用中如何體現出來呢??
非常感謝!
1。 selenium RC 如何解決ie 的 showmodaldialog打開小窗口 的問題?
2。 selenium RC 如果解決mac os上用 safari打開https的認證問題? 我試了最新的版本,裝了最新的selenium自帶的證書,但總是說SSLshakehands不成功,即使用 trustallsslcertificates也不能解決。請問你是否碰到過這類問題?對了,這個問題在windows xp下的ie6也一樣。
謝謝!
林勇