Я наконец-то решил это. И с подходом, который намного лучше, чем пытаться перехватить обработку кликов в ее различных формах. Моя уточненная цель: отложить выполнение команды сценария, когда наше приложение «занято».
Как работает обработка команд Selenium:
По завершении каждая команда селена возвращает объект ActionResult
, (см. ActionHandler.prototype.execute
) . Атрибут terminationCondition
для этого объекта - это функция, которая определяет, когда селен может перейти к следующей команде, (TestLoop.prototype.continueTestWhenConditionIsTrue
) . По сути, селен многократно выполняет функцию условия, пока не получит значение true. Результат объекта это довольно тривиально:
function ActionResult(terminationCondition) {
this.terminationCondition = terminationCondition;
}
Настройка:
Я хочу отложить выполнение в любое время myAppIsBusy()
вернет true. Конечно, все стандартные задержки также должны оставаться на месте, например, ожидание загрузки страницы и явные условия waitFor в соответствии со сценарием. Решение состоит в том, чтобы переопределить объект результата селена в моем user-extensions.js следующим образом:
function ActionResult(terminationCondition) {
this.terminationCondition = function() {
// a null terminationCondition means okay to continue
return (!terminationCondition || terminationCondition()) && !myAppIsBusy();
}
}
Самое замечательное то, что это достаточно низкий уровень, чтобы он работал как для IDE, так и для RC.
Обратите внимание, что это не влияет на типы команд Accessor или Assert, которые возвращают различные объекты результата. Но это должно быть хорошо, потому что эти команды не влияют на состояние приложения.