2010-10-06 19 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逻辑。)