2009-01-11 32 views
25

Tôi đang viết một số kiểm tra giao diện người dùng bằng cách sử dụng Selenium và tôi có điều khiển Cây JavaScript, sử dụng bộ công cụ Dojo.JavaScript mô phỏng nhấp chuột phải qua mã

Tôi đã triển khai thực đơn ngữ cảnh cho mỗi nút của cây bằng cách sử dụng các ví dụ do Dojo cung cấp, nhưng tôi cần kiểm tra Selenium để "gọi" nhấp chuột phải vào nút cây, nhưng tôi không thể làm việc này. Các bài kiểm tra chỉ đơn giản là không mô phỏng sự kiện nhấp chuột phải thông qua JavaScript và trình đơn ngữ cảnh không hiển thị.

Có ai có bất kỳ kinh nghiệm nào trong việc gọi nhấp chuột phải vào menu ngữ cảnh bằng Dojo và Selenium không? Hoặc có bất kỳ ý tưởng nào về cách thực hiện nó?

Trả lời

21

thử này thay vào đó, lý do những điều không hoàn toàn công việc là menu ngữ cảnh là trong thực tế ràng buộc với sự kiện 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); 
    } 
} 
+0

Booo-Yaaa đã thực hiện mẹo đó, cảm ơn Ieiyou. – Mark

4

Câu hỏi hay!

Tôi đã thực hiện một số nghiên cứu và có vẻ như bạn có thể kích hoạt sự kiện chuột như is shown here và làm cho nhấp chuột phải bằng cách đặt thuộc tính button hoặc which thành 2 (documented here).

Có lẽ mã này sẽ làm việc:

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); 
    } 
} 
3

Đây là một phiên bản chính xác hơn nếu bạn không quan tâm đến nơi menu ngữ cảnh bị sa thải lên

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) 
    } 
} 

Nếu bạn làm thế, chúng tôi có thể phải sử dụng trước đó, sửa chữa lên đó là hành vi trong IE, và cư trú trong screenX, Screeny, clientX, clientY vv một cách thích hợp

+0

Cảm ơn, tôi không thực sự quan tâm đến nó xảy ra ở đâu, nhưng có thể sẽ tốt hơn nếu làm như vậy trong tương lai ... – Mark

+0

Nếu bạn đang sử dụng jQuery, nhấn chuột phải vào một phần tử thậm chí còn đơn giản hơn: $ (your_element) .trigger ('trình đơn ngữ cảnh'); – sunaku

7

Chỉ cần cho biện pháp tốt, đây là một chút doco trên các thông số:

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) 
); 
+0

+1 hữu ích trong bối cảnh này – Thariama

2

Tôi đang thử tính năng này trong firefox và chrome, nhưng việc gửi sự kiện contextmenu không làm cho trình duyệt mở menu ngữ cảnh. Sự kiện được kích hoạt vì lời gọi lại của tôi cho oncontextmenu được kích hoạt, nhưng menu ngữ cảnh vẫn bị thiếu. Bất cứ ai có một ý tưởng, bởi vì tôi đã sử dụng tất cả các mẫu mã từ trên cao?

+0

FWIW Tôi có cùng một vấn đề - có thể điều này đã bị vô hiệu hóa trong một số phiên bản gần đây-ish cho bảo mật hoặc một cái gì đó? – Coderer

+0

OP đã triển khai thực đơn ngữ cảnh của riêng mình, không thể kích hoạt trình đơn ngữ cảnh của trình duyệt bằng javascript. – automaton

Các vấn đề liên quan