在2009年8月,兩個項目宣布合并,Selenium WebDriver是合并的成果。目前,WebDriver支持的語言綁定包括Java、C#、Python和Ruby。它支持Chrome、 Firefox、Opera和Android、iPhone瀏覽器。此外,還有其他關聯(lián)項目,不在同一源代碼庫中維護,但是和主項目(Selenium WebDriver)緊密合作,例如提供Perl綁定支持、BlackBerry瀏覽器支持,以及“無頭”WebKit——用于持續(xù)集成的測試其無法正常 顯示的情況。初的Selenium RC機制仍然維持,幫助WebDriver在瀏覽器不受支持的情況下提供支持。
Simon Stewart在介紹Selenium WebDriver軟件架構(gòu)之前,談到了架構(gòu)和項目開發(fā)的重要主題。概括如下:
保持成本低廉。
模擬用戶。
證明dirver運行良好......
......但是你無需了解一切細節(jié)
降低巴士因素(bus factor)。
偏愛JavaScript實現(xiàn)。
所有方法調(diào)用都是RPC調(diào)用。
我們是開源項目。
具體來說:
保持成本低廉
在Y平臺上支持X瀏覽器本質(zhì)上是一種昂貴的提議,無論是從開發(fā)還是維護角度考慮。如果我們能夠找到辦法維持產(chǎn)品的高品質(zhì)而又不違背太多其他原則,那么值得采納。這種思想明顯的體現(xiàn)在我們盡可能得使用JavaScript編程,你稍后會看到。
模擬用戶
WebDriver的設計目的是為了準確模擬用戶與Web應用交互的方式。模擬用戶輸入的常用辦法是利用Javascript合并和觸發(fā)一系列事件(如 果真實用戶執(zhí)行相同交互操作,應用會處理同樣的事件)。“合成事件”(synthesized events)方法在面對不同瀏覽器、有時相同瀏覽器的不同版本時存在不少困難,觸發(fā)的事件和相關值略有不同。為了不讓問題復雜化,大多數(shù)瀏覽器處于安全 原因不允許用戶通過這種方式與表單元素(如文件輸入元素)交互。
WebDriver總是盡可能的使用在操作系統(tǒng)層面觸發(fā)事件的方法。因為這些“原生事件”不是由瀏覽器生成,所以這種方法避免了合成事件導 致的安全限制,同時,因為它們是特定于具體操作系統(tǒng)的,一旦在某個平臺上的瀏覽器運行良好,在另一種瀏覽器上重用代碼相對容易些。困難的是,這種方法 必須滿足兩點才可行:WebDriver與瀏覽器緊密綁定,同時開發(fā)團隊在無需瀏覽器窗口獲得焦點的情況下發(fā)送原生事件(因為Selenium測試運行時 間較長,好能支持同時在機器上執(zhí)行其他任務)。目前,原生事件可用于Linux、Windows平臺,不包括Mac OS X。
不管WebDriver如何模擬用戶輸入,我們都在努力盡可能地模仿用戶行為。RC剛好相反,它提供的API層次遠低于用戶操作。
證明Driver運行良好
想讓事情十全十美(motherhood and apple pie)可能過于理想化了,但是我相信編寫無法運行的代碼是沒有意義的。證明driver(指的是WebDriver API的特定實現(xiàn)。例如,F(xiàn)irefox和Internet Explorer各有自己的driver實現(xiàn))在 Selenium項目中運行良好的辦法是我們擁有一套廣泛的自動化測試用例。這些通常是“集成測試”,需要編譯代碼并使用瀏覽器與Web服務器交互,但是 我們盡可能地編寫“單元測試”,它不像集成測試,無需完全重新編譯即可運行。目前,大約有500個集成測試和250個單元測試,涵蓋所有瀏覽器。我們在 修補缺陷和編寫新代碼時會增加測試,我們的重點正轉(zhuǎn)移到編寫更多的單元測試。
并非所有測試都要運行于每一個瀏覽器上。其中一些測試用于某些瀏覽器不支持的特定功能,或者在不同瀏覽器上處理方式不同的功能。例如,某些測試用 于新的HTML5功能,這些功能并非所有瀏覽器都支持。盡管如此,每一個主流的瀏覽器都進行了充分的測試?梢韵胂,在不同平臺上針對每種瀏覽器運行超過 500個測試是一種極大的挑戰(zhàn),我們一直在努力面對。