2010-10-06 3 views
0

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

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

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

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

ответ

0

Когда вы определяете локатор-строитель через LocatorBuilders.add (name, func), Selenium добавляет имя в глобальный массив: LocatorBuilders.order. Рекордер выполняет итерацию по этим именам в каждом пользовательском событии, вызывая каждую функцию строителя по очереди.

Пользовательские определения загружаются в IDE, настраивая ваш сценарий как «расширение ядра» или «расширение IDE». Оба набора расширений загружаются при открытии окна Selenium IDE (IDE, затем Core), поэтому может показаться неважно, какой из них указан. Но будьте осторожны, что скрипты расширения ядра перезагружены при первом воспроизведении команды в окне IDE. Поэтому скрипты, которые настроены как расширения ядра, должны быть 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.)

 Смежные вопросы

  • Нет связанных вопросов^_^