Почему рекордер Selenium IDE вызывает мою функцию LocatorBuilder несколько раз за клик пользователя? - PullRequest
0 голосов
/ 06 октября 2010

Я определил функцию LocatorBuilder и вставил ее как первый элемент массива LocatorBuilders.Это работает хорошо.Однако, когда я добавляю alert () вверху моей функции, я вижу, что моя функция вызывается дважды для каждого зарегистрированного щелчка пользователя.В частности, когда я включаю запись и нажимаю кнопку на странице, последовательность событий выглядит следующим образом: 1) моя функция вызывается, 2) щелчок записывается с использованием созданного мной выражения локатора, 3) браузер обрабатывает щелчок, 4) моя функция вызывается снова.

Примечание - я нигде не могу найти это документированное, но я предполагаю, что по сути записывающее устройство вызывает каждую функцию в списке LocatorBuilders, каждая из которых возвращает выражение-локатор кандидата, покаон получает ненулевое выражение, которое соответствует ровно одному элементу на странице.

Таким образом, моя функция работает как нужно, но дополнительный вызов функции кажется избыточным.Есть ли веская причина, по которой мою функцию построения выражений нужно вызывать более одного раза?Например, возможно ли изменение элемента HTML между вызовами?Что записывающее устройство делает между последовательными вызовами моей функции?

РЕДАКТИРОВАТЬ: DOH!Я обнаружил, что дважды добавляю свою функцию в список LocatorBuilders.order.Так что теперь моя функция вызывается только дважды.Тем не менее, почему несколько звонков?

1 Ответ

0 голосов
/ 18 октября 2010

Когда вы определяете локатор-конструктор через 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...