2010-10-06 44 views
0

我已經定義了一個LocatorBuilder函數並將它作爲LocatorBuilders數組的第一個元素插入。它工作得很好。但是,當我在函數頂部添加一個alert()函數時,我發現我的函數被記錄的每個用戶單擊都被調用兩次。具體來說,當我打開錄製並單擊頁面上的按鈕時,事件序列爲:1)調用我的函數,2)使用我生成的定位器表達式記錄點擊,3)瀏覽器處理點擊,4)我的函數被再次調用。爲什麼Selenium IDE錄像機每次用戶點擊多次呼叫我的LocatorBuilder功能?

注 - 我無法在任何地方找到它,但我從根本上推測,記錄器調用LocatorBuilders列表中的每個函數,每個函數都會返回一個候選位置表達式,直到它獲得一個非null表達式,該表達式完全匹配元素在頁面上。

所以我的函數按需要工作,但額外的函數調用似乎是多餘的。有沒有一些有效的理由,我的表達式生成器函數需要多次調用?例如,主題HTML元素可能在調用之間改變?在連續調用我的函數之間記錄器正在做什麼?

編輯:DOH!我發現我將兩個函數添加到LocatorBuilders.order列表中。所以現在我的函數只被調用兩次。儘管如此,爲什麼多次打電話?

回答

0

當您通過LocatorBuilders.add(name,func)定義定位器構建器時,Selenium將該名稱添加到全局數組:LocatorBuilders.order。記錄器在每個用戶事件上迭代這些名稱,依次調用每個構建器函數。

通過將腳本配置爲「核心擴展」或「IDE擴展」,自定義定義被加載到IDE中。當Selenium IDE窗口打開時,這兩個擴展集都會被加載(IDE然後是Core),所以它可能不會影響您指定的那一個。但要注意,在IDE窗口中第一次播放命令時,核心擴展腳本將重新加載。因此,配置爲Core擴展的腳本需要爲idempotent

因此,由於定位器構建器是Recorder功能,因此將其配置爲IDE擴展,並且它將只加載一次。如果有某些原因需要與運行時代碼共存(可能是共享邏輯),則可以將其作爲核心擴展加載,但要確保它是冪等的。 (它可能也只能在IDE中加載。)例如:

if ("SeleniumIDE" in window) { // we're running in the IDE window 
    var i = LocatorBuilders.order.indexOf(locatorName); 
    if (i != -1) 
    LocatorBuilders.order.splice(i, 1); // remove a previous entry 
    LocatorBuilders.add(locatorName, function(elem) { ... 
} 

(注意的indexOf()和拼接()陣列方法是不是所有的瀏覽器都支持,但Firefox沒有,這是IDE邏輯。)