你無(wú)需了解一切細(xì)節(jié)
很少有開(kāi)發(fā)人員精通各種語(yǔ)言和技術(shù)。因此,我們的架構(gòu)需要幫助開(kāi)發(fā)人員把他們的才華用于擅長(zhǎng)的地方,而無(wú)需處理不適合他們的代碼片段。
降低巴士因素
在軟件開(kāi)發(fā)領(lǐng)域存在一種(非正式的)概念,稱為“巴士因素”。它指的是關(guān)鍵開(kāi)發(fā)人員的數(shù)量,如果這些人遇到不幸——被大巴撞傷而離開(kāi)項(xiàng)目,那 么項(xiàng)目無(wú)法繼續(xù)進(jìn)行。像瀏覽器自動(dòng)化這樣復(fù)雜的技術(shù)特別能夠證明巴士因素的重要性,因此我們的許多架構(gòu)決策都希望能夠盡可能提高關(guān)鍵開(kāi)發(fā)人員的數(shù)量。
偏愛(ài)Javascript實(shí)現(xiàn)
WebDiver在沒(méi)有其他方式控制瀏覽器的情況下會(huì)使用純Javascript驅(qū)動(dòng)瀏覽器。這意味著我們添加的所有API都應(yīng)該傾向于偏愛(ài) Javascript實(shí)現(xiàn)。舉一個(gè)具體的例子,HTML5引入了LocalStorage,這是在客戶端存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)的API。它通常在瀏覽器中使用 SQLite實(shí)現(xiàn)。比較自然的實(shí)現(xiàn)方式是使用類似JDBC的技術(shù)為底層的數(shù)據(jù)存儲(chǔ)提供數(shù)據(jù)庫(kù)連接。終,我們決定采用底層Javascript實(shí)現(xiàn)的 API,因?yàn)橥ǔ?shù)據(jù)庫(kù)訪問(wèn)API與Javascript實(shí)現(xiàn)不太兼容。
所有方法調(diào)用都是RPC調(diào)用
WebDriver控制運(yùn)行在其它進(jìn)程中的瀏覽器。一個(gè)很容易忽視的事實(shí)是,這意味著所有API調(diào)用都是RPC調(diào)用,因此框架的性能在于網(wǎng)絡(luò)延遲 上。在正常操作中,這未必明顯——大多數(shù)操作系統(tǒng)優(yōu)化了到本機(jī)(localhost)的路由——但是隨著瀏覽器和測(cè)試代碼之間的網(wǎng)絡(luò)延遲增加,對(duì)于 API設(shè)計(jì)者和使用者來(lái)說(shuō),原本高效的調(diào)用會(huì)惡化。
這種情況給API的設(shè)計(jì)帶來(lái)了一定壓力。功能粗糙的較大規(guī)模的API可能會(huì)通過(guò)合并多個(gè)調(diào)用幫助減低延遲,但是這需要掌握平衡,時(shí)刻保持API的 可讀性和易用性。例如,有時(shí)候需要檢測(cè)某個(gè)元素是不是對(duì)終用戶可見(jiàn)。我們不僅需要考慮各種CSS屬性(可能需要通過(guò)查看父元素來(lái)推斷),也應(yīng)該檢查元素 的尺寸。低限度情況下,API應(yīng)該分別執(zhí)行所有這些檢測(cè)。WebDriver把這些功能都合并到一個(gè)方法isDisplayed中。
這是開(kāi)源項(xiàng)目
雖然嚴(yán)格意義上說(shuō),這不是一種架構(gòu)觀點(diǎn),但還是要強(qiáng)調(diào)Selenium是一個(gè)開(kāi)源項(xiàng)目。上面提到的所有觀點(diǎn)聯(lián)系在一起,表達(dá)的意思是:我們希望盡 可能的幫助新的開(kāi)發(fā)人員易于參與項(xiàng)目。降低參與門(mén)檻的措施包括盡可能使所需知識(shí)淺顯、使用的語(yǔ)言種類較少、依賴自動(dòng)化測(cè)試驗(yàn)證。
初該項(xiàng)目被劃分成一系列模塊,每一個(gè)模塊代表了一種特定的瀏覽器,其他的模塊是通用代碼和支持代碼。每一個(gè)綁定的代碼樹(shù)保存在這些模塊下面。這 種方法對(duì)于類似Java和C#的語(yǔ)言來(lái)說(shuō)非常有用,但是對(duì)于Ruby和Python的開(kāi)發(fā)人員來(lái)說(shuō)很痛苦。這種情況直接導(dǎo)致了有限的參與者,只有一小部 分人參與Python和Ruby的綁定工作。為了解決這個(gè)問(wèn)題,在2010年的十月和十一月,項(xiàng)目源代碼被重新組織,Ruby和Python代碼存放在每 種語(yǔ)言的獨(dú)立文件夾中。這種方式符合開(kāi)源開(kāi)發(fā)人員的期望,立刻吸引了社區(qū)的廣泛參與。