Когда вы определяете локатор-конструктор через LocatorBuilders.add (name, func), Selenium добавляет имя в глобальный массив: LocatorBuilders.order. Регистратор выполняет итерации по этим именам в каждом пользовательском событии, вызывая каждую функцию построителя по очереди.
Пользовательские определения загружаются в IDE путем настройки сценария как «Расширение ядра» или «Расширение IDE». Оба набора расширений загружаются при открытии окна Selenium IDE (IDE, затем Core), поэтому может показаться, что не имеет значения, какое из них вы указали. Но имейте в виду, что скрипты расширения Core перезагружаются при первом воспроизведении команды в окне IDE. Поэтому сценарии, настроенные как расширения ядра, должны быть идемпотентными .
Таким образом, поскольку локатор-компоновщик является функциональностью рекордера, настройте его как расширение IDE, и он будет загружен только один раз. Если есть какая-то причина, по которой он должен сосуществовать с кодом времени выполнения (вероятно, совместно используемая логика), вы можете загрузить его как расширение Core, но убедитесь, что он идемпотентен. (И он также может быть загружен только в 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.)