javascript - जावास्क्रिप्ट अनुकरण कोड के माध्यम से दायाँ क्लिक करें





selenium dojo mouseevent (5)


महान सवाल!

मैंने कुछ शोध किया, और ऐसा लगता है कि आप यहां दिखाए गए माउस इवेंट को आग लगा सकते हैं , और button को सेट 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);
  }
}

मैं सेलेनियम का उपयोग करके कुछ यूआई परीक्षण लिख रहा हूं और मेरे पास दोजो टूलकिट का उपयोग करके जावास्क्रिप्ट ट्री कंट्रोल है।

मैंने दोजो प्रदान किए गए उदाहरणों का उपयोग करके पेड़ के प्रत्येक नोड के लिए एक संदर्भ मेनू लागू किया है, लेकिन मुझे पेले नोड पर राइट क्लिक करने के लिए सेलेनियम परीक्षण की आवश्यकता है, लेकिन मैं इसे काम पर नहीं ला सकता। परीक्षण केवल जावास्क्रिप्ट के माध्यम से राइट-क्लिक ईवेंट अनुकरण नहीं करते हैं, और संदर्भ मेनू दिखाई नहीं देता है।

क्या किसी को Dojo और सेलेनियम का उपयोग कर संदर्भ मेनू पर राइट क्लिक का आह्वान करने में कोई अनुभव है? या इसके बारे में कोई विचार है कि इसे कैसे करें?




मैं इसे फ़ायरफ़ॉक्स और क्रोम में आज़मा रहा हूं, लेकिन contextmenu ईवेंट प्रेषण ब्राउज़र को संदर्भ मेनू खोलने के लिए नहीं बनाता है। इवेंट ट्रिगर किया गया है क्योंकि oncontextmenu के लिए मेरा कॉलबैक निकाल दिया गया है, लेकिन संदर्भ मेनू अभी भी गायब है। किसी के पास कोई विचार है, क्योंकि मैंने ऊपर से सभी कोड नमूने इस्तेमाल किए हैं?




बस अच्छे उपाय के लिए, पैरामीटर पर डॉको का थोड़ा सा है:

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



अगर आपको कोई परवाह नहीं है कि संदर्भ मेनू कहां से निकाल दिया गया है, तो यहां एक और सही संस्करण है

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

यदि आप करते हैं, तो हमें पिछले एक का उपयोग करना होगा, आईई में इसका व्यवहार ठीक करना होगा, और स्क्रीनएक्स, स्क्रीनवाई, क्लाइंटएक्स, क्लाइंटवाई आदि को उचित रूप से पॉप्युलेट करना होगा




आपके प्रश्न शीर्षक में आपके द्वारा उपयोग की जाने वाली अवधि Remove a property from a JavaScript object , जिसे कुछ अलग तरीकों से व्याख्या किया जा सकता है। एक इसे पूरी मेमोरी और ऑब्जेक्ट कुंजियों की सूची के लिए निकालना है या दूसरा इसे अपने ऑब्जेक्ट से निकालना है। जैसा कि कुछ अन्य उत्तरों में इसका उल्लेख किया गया है, delete कीवर्ड मुख्य भाग है। मान लें कि आपके पास अपनी वस्तु है:

myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

यदि तुम करो:

console.log(Object.keys(myJSONObject));

नतीजा होगा:

["ircEvent", "method", "regex"]

आप अपनी ऑब्जेक्ट कुंजी से उस विशिष्ट कुंजी को हटा सकते हैं जैसे:

delete myJSONObject["regex"];

फिर ऑब्जेक्ट.कीज़ Object.keys(myJSONObject) का उपयोग करके आपकी ऑब्जेक्ट कुंजी होगी:

["ircEvent", "method"]

लेकिन मुद्दा यह है कि यदि आप स्मृति के बारे में परवाह करते हैं और आप पूरे ऑब्जेक्ट को स्मृति से हटा देते हैं, तो इसे कुंजी हटाने से पहले इसे शून्य पर सेट करने की अनुशंसा की जाती है:

myJSONObject["regex"] = null;
delete myJSONObject["regex"];

यहां अन्य महत्वपूर्ण बिंदु एक ही वस्तु के आपके अन्य संदर्भों के बारे में सावधान रहना है। उदाहरण के लिए, यदि आप एक चर बनाते हैं जैसे:

var regex = myJSONObject["regex"];

या इसे किसी अन्य ऑब्जेक्ट में एक नए पॉइंटर के रूप में जोड़ें जैसे:

var myOtherObject = {};
myOtherObject["regex"] = myJSONObject["regex"];

फिर भी यदि आप इसे अपने ऑब्जेक्ट myJSONObject से हटा myJSONObject , तो उस विशिष्ट ऑब्जेक्ट को स्मृति से हटाया नहीं जाएगा, क्योंकि regex चर और myOtherObject["regex"] पास अभी भी उनके मान हैं। तो हम वस्तु को स्मृति से निश्चित रूप से कैसे हटा सकते हैं?

जवाब आपके कोड में आपके सभी संदर्भों को हटाना होगा , उस वस्तु को इंगित करता है और उस ऑब्जेक्ट के नए संदर्भ बनाने के लिए var कथन का भी उपयोग नहीं करता हैvar बयानों के बारे में यह आखिरी बिंदु, सबसे महत्वपूर्ण मुद्दों में से एक है जिसका हम आम तौर पर सामना कर रहे हैं, क्योंकि var कथनों का उपयोग करने से बनाए गए ऑब्जेक्ट को हटा दिया जा सकता है।

जिसका अर्थ है कि इस मामले में आप उस ऑब्जेक्ट को हटाने में सक्षम नहीं होंगे क्योंकि आपने एक var स्टेटमेंट के माध्यम से regex वैरिएबल बनाया है, और यदि आप ऐसा करते हैं:

delete regex; //False

परिणाम false होगा, जिसका अर्थ है कि आपके डिलीट स्टेटमेंट को आपके द्वारा अपेक्षित रूप से निष्पादित नहीं किया गया है। लेकिन अगर आपने पहले उस चर को नहीं बनाया था, और आपके पास केवल myOtherObject["regex"] अंतिम संदर्भ के रूप में myOtherObject["regex"] , तो आप इसे इस तरह से हटाकर ऐसा कर सकते थे:

myOtherObject["regex"] = null;
delete myOtherObject["regex"];

दूसरे शब्दों में, जैसे ही आपके कोड में कोई संदर्भ नहीं छोड़ा जाता है, उस वस्तु पर इंगित होने पर कोई जावास्क्रिप्ट ऑब्जेक्ट मारे जाते हैं।

अद्यतन: @AgentME के ​​लिए धन्यवाद:

इसे हटाने से पहले किसी संपत्ति को शून्य पर सेट करना कुछ भी पूरा नहीं करता है (जब तक ऑब्जेक्ट ऑब्जेक्ट.सेल द्वारा सील नहीं किया जाता है और हटाए जाने में विफल रहता है। आमतौर पर यह मामला आमतौर पर तब तक नहीं होता जब तक आप विशेष रूप से प्रयास नहीं करते)।

अधिक जानकारी प्राप्त करने के लिए Object.seal: Object.seal()







javascript selenium dojo mouseevent