JavaScript симулирует правый клик по коду
-
10-07-2019 - |
Вопрос
Я пишу некоторые тесты пользовательского интерфейса, используя Selenium, и у меня есть элемент управления JavaScript Tree, использующий инструментарий Dojo. Р>
Я реализовал контекстное меню для каждого узла дерева, используя примеры, которые предоставляет Dojo, но мне нужен тест Selenium, чтобы «вызвать» щелкните правой кнопкой мыши узел дерева, но я не могу заставить это работать. Тесты просто не имитируют событие щелчка правой кнопкой мыши через JavaScript, и контекстное меню не отображается.
Кто-нибудь имел опыт вызова правой кнопкой мыши контекстного меню с помощью Dojo и Selenium? Или есть идеи, как это сделать?
Решение
попробуйте вместо этого, причина того, что вещи не совсем работали, заключается в том, что контекстное меню фактически связано с событием 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);
}
}
Другие советы
Просто для примера, немного о параметрах:
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)
);
Отличный вопрос!
Я провел небольшое исследование, и кажется, что вы можете запустить событие мыши, например, отображается здесь , и сделайте его правой кнопкой мыши, установив для свойства 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);
}
}
Вот более правильная версия, если вам не важно, где запускается контекстное меню
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 и т. д. соответствующим образом
Я пытаюсь сделать это в Firefox и Chrome, но отправка события contextmenu не заставляет браузер открывать контекстное меню. Событие вызвано тем, что мой обратный вызов для oncontextmenu запущен, но контекстное меню по-прежнему отсутствует. У кого-нибудь есть идея, потому что я использовал все примеры кода сверху?