JavaScript имитирует щелчок правой кнопкой мыши через код

Я пишу некоторые тесты пользовательского интерфейса с использованием Selenium, и у меня есть элемент управления JavaScript Tree с использованием набора инструментов Dojo.

Я реализовал контекстное меню для каждого узла дерева, используя примеры, которые предоставляет Dojo, но мне нужен тест Selenium, чтобы «вызвать» щелчок правой кнопкой мыши по узлу дерева, но я не могу заставить это работать. Тесты просто не моделируют событие щелчка правой кнопкой мыши с помощью JavaScript, и контекстное меню не отображается.

У кого-нибудь был опыт вызова контекстного меню правой кнопкой мыши с помощью Dojo и Selenium? Или есть идеи, как это сделать?


person Mark    schedule 11.01.2009    source источник


Ответы (5)


попробуйте вместо этого, причина того, что что-то не совсем сработало, заключается в том, что контекстное меню на самом деле привязано к событию oncontextmenu.

function contextMenuClick(element){
    var evt = element.ownerDocument.createEvent('MouseEvents');

    var RIGHT_CLICK_BUTTON_CODE = 2; // the same for FF and IE

    evt.initMouseEvent('contextmenu', true, true,
         element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false,
         false, false, false, RIGHT_CLICK_BUTTON_CODE, null);

    if (document.createEventObject){
        // dispatch for IE
       return element.fireEvent('onclick', evt)
     }
    else{
       // dispatch for firefox + others
      return !element.dispatchEvent(evt);
    }
}
person leiyou    schedule 12.01.2009

На всякий случай вот немного документации по параметрам:

var myEvt = document.createEvent('MouseEvents');
myEvt.initMouseEvent(
   'click'          // event type
   ,true           // can bubble?
   ,true           // cancelable?
   ,window      // the event's abstract view (should always be window)
   ,1              // mouse click count (or event "detail")
   ,100           // event's screen x coordinate
   ,200           // event's screen y coordinate
   ,100           // event's client x coordinate
   ,200           // event's client y coordinate
   ,false         // whether or not CTRL was pressed during event
   ,false         // whether or not ALT was pressed during event
   ,false         // whether or not SHIFT was pressed during event
   ,false         // whether or not the meta key was pressed during event
   ,1             // indicates which button (if any) caused the mouse event (1 = primary button)
   ,null          // relatedTarget (only applicable for mouseover/mouseout events)
); 
person Mark    schedule 12.01.2009

Отличный вопрос!

Я провел небольшое исследование, и похоже, что вы можете запустить событие мыши, например отображается здесь, и щелкните его правой кнопкой мыши, установив для свойства button или which значение 2 (задокументировано здесь).

Возможно, этот код будет работать:

function rightClick(element){
  var evt = element.ownerDocument.createEvent('MouseEvents');

  var RIGHT_CLICK_BUTTON_CODE = 2; // the same for FF and IE

  evt.initMouseEvent('click', true, true,
      element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false,
      false, false, false, RIGHT_CLICK_BUTTON_CODE, null);

  if (document.createEventObject){
    // dispatch for IE
    return element.fireEvent('onclick', evt)
  }
  else{
    // dispatch for firefox + others
    return !element.dispatchEvent(evt);
  }
}
person orip    schedule 11.01.2009

Вот более правильная версия, если вас не волнует, где запускается контекстное меню

function fireContextMenu(el) {
  var evt = el.ownerDocument.createEvent("HTMLEvents")
  evt.initEvent('contextmenu', true, true) // bubbles = true, cancelable = true

  if (document.createEventObject) {
    return el.fireEvent('oncontextmenu', evt)
  }
  else {
    return !el.dispatchEvent(evt)
  }
}

Если вы это сделаете, нам, возможно, придется использовать предыдущий, исправить его поведение в IE и соответствующим образом заполнить screenX, screenY, clientX, clientY и т. Д.

person leiyou    schedule 12.01.2009
comment
Спасибо, меня вообще не волнует, где это произойдет, но, возможно, будет неплохо сделать это в будущем ... - person Mark; 12.01.2009
comment
Если вы используете jQuery, щелкнуть элемент правой кнопкой мыши еще проще: $ (your_element) .trigger ('contextmenu'); - person sunaku; 19.01.2011

Я пробую это в firefox и chrome, но отправка события contextmenu не заставляет браузер открывать контекстное меню. Событие запускается, потому что мой обратный вызов для oncontextmenu запущен, но контекстное меню все еще отсутствует. У кого-нибудь есть идея, потому что я использовал все примеры кода сверху?

person bellpeace    schedule 19.07.2011
comment
FWIW У меня такая же проблема - может быть, это было отключено в некоторых последних версиях для безопасности или что-то в этом роде? - person Coderer; 07.09.2012
comment
OP реализовал свои собственные контекстные меню, невозможно вызвать контекстное меню браузера с помощью javascript. - person automaton; 14.03.2015