0

我已经定义了一个 LocatorBuilder 函数并将其作为 LocatorBuilders 数组的第一个元素插入。它运行良好。但是,当我在函数顶部添加一个 alert() 时,我发现每次记录的用户点击都会调用我的函数两次。具体来说,当我打开录制并单击页面上的按钮时,事件顺序是:1)我的函数被调用,2)使用我生成的定位器表达式记录点击,3)浏览器处理点击, 4) 我的函数再次被调用。

注意 - 我无法在任何地方找到此文档,但我推测从根本上讲,记录器调用 LocatorBuilders 列表中的每个函数,每个函数都返回一个候选定位器表达式,直到它获得一个与页面上的一个元素完全匹配的非空表达式.

所以我的函数按需要工作,但额外的函数调用似乎是多余的。是否有正当理由需要多次调用我的表达式构建器函数?例如,主题 HTML 元素是否可以在调用之间更改?在连续调用我的函数之间记录器在做什么?

编辑:DOH!我发现我将函数添加到 LocatorBuilders.order 列表中两次。所以现在我的函数只被调用了两次。尽管如此,为什么要多次调用?

4

1 回答 1

0

当您通过 LocatorBuilders.add(name, func) 定义定位器构建器时,Selenium 将名称添加到全局数组:LocatorBuilders.order。记录器在每个用户事件上迭代这些名称,依次调用每个构建器函数。

通过将脚本配置为“核心扩展”或“IDE 扩展”,将自定义定义加载到 IDE 中。当 Selenium IDE 窗口打开时,这两组扩展都被加载(IDE 然后是 Core),因此您指定哪一个似乎并不重要。但请注意,第一次在 IDE 窗口中播放命令时会重新加载核心扩展脚本。因此,配置为核心扩展的脚本需要是幂等的。

因此,由于 locator-builder 是 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() 和 splice() 数组方法,但 Firefox 支持,这是 IDE 逻辑。)

于 2010-10-18T16:38:10.687 回答