Going Atomic:方法

這是我的第二篇技術文章。同樣地,如果您對 Selenium 2 的內部運作方式感興趣,請直接跳到其他內容。

這是我的第二篇技術文章。同樣地,如果您對 Selenium 2 的內部運作方式感興趣,請直接跳到其他內容。如果您對我們如何以及為何針對專案做出一些技術決策感興趣,請繼續閱讀…。

我們將我們英勇的主角們留在一個棘手的位置:他們已決定編寫一個程式碼共用程式庫,供各種 webdriver 實作和 selenium core 使用,但這樣做的需求似乎與其實際發生相矛盾。

幸運的是,大約在我們開始走上這條道路的同時,Google 開源了 Closure 編譯器。這是一個 Javascript 編譯器,它將一組 Javascript 檔案作為輸入,並輸出 Javascript。它可以設定為將程式碼原封不動地傳遞到單個檔案中,或者它可以積極地編譯腳本,刪除未使用的程式碼路徑並盡可能縮小輸出。Closure 編譯器已在許多 Google 產品中使用,因此我們知道它是可靠且一致的。

為了充分利用 Closure 編譯器,我們正在使用 Closure 程式庫 編寫 atoms。它不像其他一些 JS 程式庫那樣廣為人知,但它很穩固、經過充分測試並且正在積極開發中。它還具有 JsUnit 的易於使用的擴展,這使得編寫測試比其他情況下要簡單得多,並且它具有易於使用的程式碼模組化機制。

因此,假設我們可以將單個 Javascript 函數(及其依賴項)編譯成 JS 的縮小片段,我們就一切就緒了,對吧?不完全是。

問題在於 atoms 是從兩個以不同方式看待世界的框架中提取出來的。例如,Selenium 1 的 getAttribute (http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#getAttribute(java.lang.String)) 方法僅傳回特定屬性的值,而 WebDriver 的 getAttribute (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html#getAttribute(java.lang.String)) 方法將傳回屬性或特性的值(因為有時很難記住某個東西是元素的屬性還是特性)

與電腦科學中的所有問題一樣,使用額外的間接層級來解決此問題。

我們正忙於在 atoms 之上實作 WebDriverSelenium API 的預期行為。

當然,還有一個顯而易見的問題,就是我們如何將這種精心壓縮的 JS 放入驅動程式中。一種選擇是將原始 Javascript 作為檔案包含在每種語言繫結中,並根據需要將它們拉入。這是有可能的,但會使每種語言繫結變得臃腫,並會引入大量重複。另一種選擇是將 atoms 盡可能地推入驅動程式,而這正是我們所做的。作為 webdriver 建置過程的一部分,我們採用壓縮後的 JS 並將其轉換為特定驅動程式可以使用的形式。例如,對於 IE 驅動程式,我們將它們轉換為 C 標頭檔 中的常數。然後,驅動程式可以參考這些常數,並將其轉換回腳本,然後透過與 “executeScript” 使用的相同機制來執行。

這種看似巴洛克式的方法能讓我們獲得什麼?除了能夠在驅動程式之間共用相同的程式碼之外?還有很多好處。維護成本大幅降低,因為我們可以在一個地方修正錯誤,並且每個驅動程式都會接收到該修正。由於我們使用純 JS 並且僅查詢 DOM,因此我們可以在開發程式碼時在瀏覽器中執行單元測試。這帶來非常緊密的意見回饋週期。這也讓不熟悉程式碼的開發人員更容易查看我們做事的方式,並向我們發送修補程式(始終感謝!)。最後,我們可以確保結果的一致性。

好的,有任何問題嗎?

上次修改時間為 2024 年 4 月 5 日:損壞的連結 (#1612)[部署網站] (c73064b0d9b)