JavaScript 코드를 마우스 오른쪽 버튼으로 클릭하십시오
-
10-07-2019 - |
문제
Selenium을 사용하여 UI 테스트를 작성하고 있으며 DOJO 툴킷을 사용하여 JavaScript 트리 컨트롤이 있습니다.
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);
}
}
다른 팁
좋은 측정을 위해, 여기에 매개 변수에 대한 약간의 doco가 있습니다.
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 ~ 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의 콜백이 시작되었지만 컨텍스트 메뉴가 여전히 누락되어 이벤트가 트리거됩니다. 위의 모든 코드 샘플을 사용했기 때문에 아이디어가 있습니까?