Windows 選取的難處
在錄製測試案例時,通常會出現視窗管理問題,測試案例可能會開啟彈出視窗,或追蹤 target=_blank
連結。不過,Selenium IDE 預期會追蹤並記錄視窗和分頁切換,這樣一來就不需要在錄製後手動修正。
但問題在於選取視窗是有狀態的。
Select Window 的演進
Select Window 最初是在舊版 IDE 中引入的(又稱為 selectWindow),它當時也知道,無法根據任何定義的屬性(例如標題、網址等)來追蹤視窗...
相反地,它會為每個視窗產生一個暫時 ID,要求使用者手動介入並為每個視窗提供一個永久 ID,這項功能是由於 IDE 會覆寫 _blank
目標,並將呼叫重新導向到 window.open
。
之後 SideeX 出現,他們的解決方案更直觀,但目光短淺。他們的點子是利用 browser.webNavigation.onCreatedNavigationTarget
,這個事件讓 IDE 知道何時開啟新的分頁或視窗,以及其建立原因。這可以輕鬆地對開啟的分頁樹狀結構進行對應,並根據其出現順序給予所有分頁 ID。
這樣一來,使用者自然而然就能選擇他們想要的任何視窗,而不用多想幕後在做什麼。
這兩種解決方案都有缺點。舊有解決方案要求使用者隨時知道已開啟分頁的狀態,並且每次呼叫同一個視窗時都要給予相同的 ID。
另一方面,SideeX 沒有考慮到 IDE 未來的擴充,現在有了控制流程指令,即使在錄製期間,視窗可能永遠不會開啟,或者更糟的是,視窗可能會在迴圈中開啟,這進一步複雜化了追蹤機制。
中間人解決方案
到目前為止,我們知道兩件事
- 我們不能讓使用者手動找出視窗配置。
- 我們不能依賴視窗的屬性或索引來識別它們。
我們將使用中間人解決方案,我這樣稱呼它,因為它是一個解決方案,同時需要使用者命名他們的視窗,並且它會在錄製後立即且持續地追蹤視窗。
當我們發現一個視窗已開啟時,我們不會根據它的出現順序產生 ID,而是將它的控制代碼儲存到使用者將命名的變數中。
從此點開始,我們可以透過 ID 而不是索引來可靠地參照視窗。
click
指令現在可以指定它開啟一個新視窗,然後使用者可以為視窗命名,並設定等待該視窗出現的逾時時間。
在錄製時,IDE 會假設等待 2 秒,並會為視窗產生一個名稱。
發布計畫
使用較新版本的 IDE 開啟 IDE 專案,會自動將測試腳本移轉到使用新的 select window
指令。
移轉會嘗試辨識何時開啟新視窗,並將該指令設定為開啟視窗,將產生控制代碼名稱,並將逾時時間設定為 2 秒。
在某些情況下,IDE 無法辨識哪個指令啟動開啟視窗,測試案例會失敗,使用者必須修正移轉。
此外,在使用者來回切換初始視窗的情況下,IDE 將使用測試案例中新的 store current window handle
指令儲存初始視窗的控制代碼。
目前的計畫是將變更作為 3.5 版本的一部分進行,以準備使用 WebDriver 進行播放。
特別感謝 @tourdedave 進行編輯。