दिलचस्प पोस्ट
Event.preventDefault () का उपयोग करने के बाद ईवेंट को ट्रिगर कैसे करें जब जावा, रनटाइम या समय संकलन में स्थिर वैरिएबल लोड हो रहा है? जावा में किसी मौजूदा XML फ़ाइल में मैं नोड कैसे जोड़ूं? .NET एप से Google के वी 8 इंजन को संदर्भित करना Android अंतहीन सूची कैसे सूची / ArrayList से अधिकतम मूल्य प्राप्त करने के लिए कॉलम संख्या को अक्षर में कनवर्ट करने के लिए फ़ंक्शन? लगातार गुणों के साथ-साथ सूचकांक तक पहुँच के लिए अभिज्ञात रूप से प्रवेश करें? jQuery के यूआई टैब वापस बटन इतिहास सी # कन्बोब्क्स या टेक्स्ट बॉक्स में मैं कैसे गतिशील रूप से ऑटो पूर्ण प्रविष्टियों को बदल सकता / सकती हूं? कैसे सी में structs की एक सरणी सॉर्ट करने के लिए? एंड्रॉइड एक कैमरे के बिटमैप की ओरिएंटेशन प्राप्त करें? और पीछे -90 डिग्री घुमाएं स्विफ्ट: संदर्भ से पास की सरणी? UIAlertController की बर्खास्तगी को रोकें ListView में अलग पंक्ति लेआउट

वेबड्राइवर क्लिक करें () बनाम जावास्क्रिप्ट क्लिक करें ()

कहानी:

यहाँ स्टैक ओवरफ्लो पर, मैंने उपयोगकर्ताओं को रिपोर्ट किया है कि वे सेलेनियम वेबड्रायवर "क्लिक" कमांड के माध्यम से एक तत्व पर क्लिक नहीं कर सकते हैं और यह एक स्क्रिप्ट निष्पादित करके क्लिक करके जावास्क्रिप्ट क्लिक कर सकते हैं।

पायथन में उदाहरण:

element = driver.find_element_by_id("myid") driver.execute_script("arguments[0].click();", element) 

WebDriverJS / प्रोट्रेक्टर में उदाहरण:

 var elm = $("#myid"); browser.executeScript("arguments[0].click();", elm.getWebElement()); 

प्रश्न:

एक नियमित वेबड्राइवर क्लिक करने पर "जावास्क्रिप्ट के जरिए" क्लिक क्यों होता है? जब ऐसा हो रहा है और इस समाधान के नकारात्मक पक्ष (यदि कोई हो) है?

मैंने व्यक्तिगत रूप से इसे समझने के बिना इस समाधान का इस्तेमाल किया है कि मुझे यह क्यों करना है और यह किस समस्या से उत्पन्न हो सकती है

Solutions Collecting From Web of "वेबड्राइवर क्लिक करें () बनाम जावास्क्रिप्ट क्लिक करें ()"

वर्तमान में स्वीकार किए गए उत्तर के मुताबिक प्रस्तावित फॉंटमजेएस के लिए कुछ खास बात नहीं है, जब वेबड्रायवर के पास क्लिक करने और जावास्क्रिप्ट करने के बीच अंतर होने की बात आती है

अंतर

दो तरीकों के बीच में आवश्यक अंतर सभी ब्राउज़रों के लिए सामान्य है और बहुत स्पष्ट रूप से समझाया जा सकता है:

  • वेबड्राइवर: जब वेबड्राइवर क्लिक करता है, तो यह सर्वोत्तम रूप में प्रयास करता है क्योंकि यह अनुकरण करता है कि वास्तविक उपयोगकर्ता ब्राउज़र का उपयोग करने पर क्या होता है। मान लीजिए आपके पास एक तत्व ए है जो एक बटन है जो "मुझे क्लिक करें" और एक तत्व बी कहते हैं जो कि एक div तत्व है जो पारदर्शी है, लेकिन इसके आयाम और zIndex सेट हैं, ताकि यह पूरी तरह से ए को कवर कर सके। फिर आप WebDriver को ए पर क्लिक करने के लिए कहें। वेबड्राइवर क्लिक को अनुकरण करेगा ताकि बी को पहले क्लिक प्राप्त हो। क्यूं कर? क्योंकि बी को कवर करता है, और अगर कोई उपयोगकर्ता ए पर क्लिक करने की कोशिश करता है, तो बी पहले ईवेंट प्राप्त करेगा। चाहे या नहीं, ए अंततः क्लिक ईवेंट मिलेगा इस बात पर निर्भर करता है कि बी कैसे ईवेंट को संभालता है। किसी भी दर पर, इस मामले में वेबड्राइवर के व्यवहार उसी तरह होते हैं जब असली उपयोगकर्ता ए पर क्लिक करने की कोशिश करता है।

  • जावास्क्रिप्ट: अब, मान लीजिए कि आप A.click() को जावास्क्रिप्ट का उपयोग करते हैं। क्लिक करने की यह विधि प्रतिरूपण नहीं करती है कि वास्तव में तब क्या होता है जब उपयोगकर्ता ए क्लिक करने की कोशिश करता है। जावास्क्रिप्ट एक click ईवेंट को सीधे ए पर भेजता है, और बी किसी भी घटना को नहीं मिलेगा।

क्यों एक जावास्क्रिप्ट क्लिक वर्क्स जब एक WebDriver क्लिक नहीं करता है?

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

जब आप क्लिक करने के लिए जावास्क्रिप्ट का उपयोग करना चाहिए?

यदि आप एक आवेदन का परीक्षण करने के लिए सेलेनियम का उपयोग कर रहे हैं, तो इस सवाल का मेरा जवाब "लगभग कभी नहीं" है। और बड़े से, आपके सेलेनियम परीक्षण को पुन: उत्पन्न करना चाहिए कि उपयोगकर्ता ब्राउज़र के साथ क्या करेगा। ड्रॉप डाउन मेनू का उदाहरण लेना: एक टेस्ट को उस बटन पर क्लिक करना चाहिए जो पहले ड्रॉप डाउन लाता है, और फिर मेनू आइटम पर क्लिक करें। अगर GUI में कोई समस्या है क्योंकि बटन अदृश्य है, या बटन मेनू आइटम दिखाने में विफल रहता है, या कुछ इसी तरह की है, तो आपका परीक्षण विफल हो जाएगा और आपको बग का पता चल जाएगा। यदि आप जावास्क्रिप्ट का इस्तेमाल चारों ओर क्लिक करने के लिए करते हैं, तो आप स्वचालित परीक्षण के माध्यम से इन बगों का पता लगाने में सक्षम नहीं होंगे।

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

यदि आप स्क्रैपिंग साइट्स के लिए सेलेनियम का उपयोग कर रहे हैं, तो उपयोगकर्ता व्यवहार को पुन: उत्पन्न करने का प्रयास करना महत्वपूर्ण नहीं है। इसलिए जीयूआई को बायपास करने के लिए जावास्क्रिप्ट का उपयोग करना एक समस्या से कम है।

चालक द्वारा निष्पादित क्लिक वास्तविक उपयोगकर्ता के व्यवहार को यथासंभव करीब अनुकरण करने का प्रयास करता है, जबकि जावास्क्रिप्ट HTMLElement.click() click ईवेंट के लिए डिफ़ॉल्ट क्रिया करता है, भले ही तत्व इंटरैक्ट करने योग्य न हो।

मतभेद हैं:

  • चालक यह सुनिश्चित करता है कि तत्व इसे दृश्य में स्क्रॉल करके दिखाई देता है और जांचता है कि तत्व इंटरैक्ट योग्य है

    ड्राइवर एक त्रुटि बढ़ाएगा:

    • जब क्लिक के निर्देशांक पर शीर्ष पर तत्व लक्ष्यित तत्व या वंश नहीं होता है
    • जब तत्व में कोई सकारात्मक आकार नहीं होता है या यह पूरी तरह से पारदर्शी है
    • जब तत्व एक अक्षम इनपुट या बटन होता है (विशेषता / गुण disabled है)
    • जब तत्व में माउस पॉइंटर अक्षम होता है (सीएसएस pointer-events none )

    एक जावास्क्रिप्ट HTMLElement.click() हमेशा डिफ़ॉल्ट कार्य निष्पादित करेगा या अगर तत्व एक अक्षम है, तो सबसे अच्छा चुपचाप विफल हो जाएगा।

  • ड्राइवर को ध्यान केंद्रित करने के लिए तत्व को लाने की उम्मीद है अगर यह फोकसनीय है।

    एक जावास्क्रिप्ट HTMLElement.click() नहीं होगा

  • उम्मीद की जाती है कि चालक को सभी घटनाओं (माउसमोव, मउसेडॉउन, माउसअप, क्लिक, …) को वास्तविक उपयोगकर्ता की तरह फेंकने की उम्मीद है

    एक जावास्क्रिप्ट HTMLElement.click() केवल click ईवेंट उत्सर्जन करता है। पृष्ठ इन अतिरिक्त घटनाओं पर भरोसा कर सकता है और यदि वे उत्सर्जित नहीं हैं तो अलग व्यवहार कर सकते हैं

    ये क्रोम के साथ क्लिक के लिए चालक द्वारा उत्सर्जित की जाने वाली घटनाएं हैं:

     mouseover {target:#topic, clientX:222, clientY:343, isTrusted:true, ... } mousemove {target:#topic, clientX:222, clientY:343, isTrusted:true, ... } mousedown {target:#topic, clientX:222, clientY:343, isTrusted:true, ... } mouseup {target:#topic, clientX:222, clientY:343, isTrusted:true, ... } click {target:#topic, clientX:222, clientY:343, isTrusted:true, ... } 

    और यह एक जावास्क्रिप्ट इंजेक्शन के साथ उत्सर्जित घटना है:

     click {target:#topic, clientX:0, clientY:0, isTrusted:false, ... } 
  • एक जावास्क्रिप्ट .click() द्वारा उत्सर्जित घटना विश्वसनीय नहीं है और डिफ़ॉल्ट कार्रवाई को लागू नहीं किया जा सकता है:

    https://developer.mozilla.org/en/docs/Web/API/Event/isTrusted
    https://googlechrome.github.io/samples/event-istrusted/index.html

    ध्यान दें कि कुछ ड्राइवर अभी भी अविश्वसनीय घटनाएं पैदा कर रहे हैं। यह संस्करण 2.1 के रूप में PhantomJS के साथ मामला है।

  • एक जावास्क्रिप्ट .click() द्वारा उत्सर्जित होने वाला इवेंट क्लिक के निर्देशांक नहीं है

    गुण clientX, clientY, screenX, screenY, layerX, layerY 0 सेट हैं पृष्ठ उन पर निर्भर हो सकता है और अलग तरीके से व्यवहार कर सकता है

कुछ डेटा स्क्रैप करने के लिए JavaScript .click() का उपयोग करना ठीक हो सकता है, लेकिन यह परीक्षण के संदर्भ में नहीं है। यह परीक्षण के उद्देश्य को समाप्त करता है क्योंकि यह किसी उपयोगकर्ता के व्यवहार को अनुकरण नहीं करता है इसलिए, अगर चालक से क्लिक विफल हो जाता है, तो वास्तविक उपयोगकर्ता एक ही क्लिक में एक ही परिस्थितियों में भी असफल हो जायेगा।

जब हम अपेक्षा करते हैं कि चालक किसी तत्व को क्लिक करने में विफल रहता है तो क्या?

  • देरी या संक्रमण प्रभाव के कारण लक्षित तत्व अभी तक दिखाई नहीं दे रहा है

    कुछ उदाहरण :

    https://developer.mozilla.org/fr/docs/Web (ड्रॉपडाउन नेविगेशन मेनू) http://materializecss.com/side-nav.html (ड्रॉपडाउन साइड बार)

    Workarrounds:

    दृश्यता, एक न्यूनतम आकार या स्थिर स्थिति की प्रतीक्षा करने के लिए एक वेटर जोड़ें:

     // wait visible browser.wait(ExpectedConditions.visibilityOf(elem), 5000); // wait visible and not disabled browser.wait(ExpectedConditions.elementToBeClickable(elem), 5000); // wait for minimum width browser.wait(function minimumWidth() { return elem.getSize().then(size => size.width > 50); }, 5000); 

    इसे सफल होने तक क्लिक करने का पुन: प्रयास करें:

     browser.wait(function clickSuccessful() { return elem.click().then(() => true, (ex) => false); }, 5000); 

    एनीमेशन / संक्रमण की अवधि से मेल खाते देरी जोड़ें:

     browser.sleep(250); 

  • लक्ष्यित तत्व समाप्त होता है एक फ्लोटिंग तत्व द्वारा कवर किया जाता है, एक बार दृश्य में स्क्रॉल करता है:

    ड्रायवर स्वतः दृश्य को दृश्य बनाने के लिए तत्व को स्क्रॉल करता है यदि पृष्ठ में एक अस्थायी / चिपचिपा तत्व (मेनू, विज्ञापन, पादलेख, सूचना, कुकी नीति ..) शामिल है, तो तत्व अंत में आच्छादित हो सकता है और अब दृश्य / इंटरैक्ट करने योग्य नहीं होगा।

    उदाहरण: https://twitter.com/?lang=en

    समाधान:

    स्क्रॉलिंग या फ्लोटिंग तत्व से बचने के लिए खिड़की के आकार को एक बड़े आकार में सेट करें

    एक नकारात्मक Y ऑफसेट के साथ तत्व पर आगे बढ़ें और फिर उसे क्लिक करें:

      browser.actions() .mouseMove(elem, {x: 0, y: -250}) .click() .perform(); 

    क्लिक करने से पहले तत्व को खिड़की के केंद्र में स्क्रॉल करें:

     browser.executeScript(function scrollCenter(elem) { var win = elem.ownerDocument.defaultView || window, box = elem.getBoundingClientRect(), dy = box.top - (win.innerHeight - box.height) / 2; win.scrollTo(win.pageXOffset, win.pageYOffset + dy); }, element); element.click(); 

    यदि इसे टाला नहीं जा सकता है तो अस्थायी तत्व छुपाएं:

     browser.executeScript(function scrollCenter(elem) { elem.style.display = 'none'; }, element); 

नोट: चलो 'क्लिक' कॉल अंत उपयोगकर्ता है क्लिक करें जेएस क्लिक 'जे एस के माध्यम से क्लिक करें

एक नियमित वेबड्राइवर क्लिक करने पर "जावास्क्रिप्ट के जरिए" क्लिक क्यों होता है?

इसके लिए 2 मामले हैं:

I. अगर आप फामटॉम जे एस का उपयोग कर रहे हैं

फिर यह PhantomJS का सबसे आम ज्ञात व्यवहार है। कुछ तत्व कभी-कभी क्लिक करने योग्य नहीं होते हैं, उदाहरण के लिए <div> । ऐसा इसलिए है क्योंकि PhantomJS मूल रूप से ब्राउज़रों के इंजन का अनुकरण करने के लिए बनाया गया था (जैसे प्रारंभिक HTML + CSS -> कंप्यूटिंग सीएसएस -> रेंडरिंग)। लेकिन यह अंत-उपयोगकर्ता के तरीके (देखने, क्लिक करने, खींचने के साथ) के साथ बातचीत करने का मतलब नहीं है। इसलिए PhamtomJS अंत-उपयोगकर्ता के PhamtomJS से केवल आंशिक रूप से समर्थन करता है।

जेएस क्लिक क्यों काम करता है? या तो क्लिक्स के लिए, ये सभी मतलब क्लिक हैं। यह 1 बैरल और 2 ट्रिगर्स के साथ बंदूक की तरह है व्यूपोर्ट में से एक, जेएस से एक चूंकि PhamtomJS जे एस ब्राउज़र के इंजन का अनुकरण करने में महान है, जे एस क्लिक पूरी तरह से काम करना चाहिए।

द्वितीय। "क्लिक" के ईवेंट हैंडलर को समय की खराब अवधि में बाँधना पड़ा।

उदाहरण के लिए हमें <div> मिला

  • -> हम कुछ गणना करते हैं

  • -> तब हम <div> क्लिक करने की घटना को बांध देते हैं

  • -> प्लस कोने के कुछ खराब कोडिंग के साथ (उदाहरण के तौर पर गुंजाइश के चक्र को नियंत्रित नहीं करना)

हम एक ही परिणाम के साथ समाप्त हो सकता है क्लिक काम नहीं करेगा, क्योंकि WebdriverJS तत्व पर क्लिक करने की कोशिश कर रहा है, जब कोई क्लिक ईवेंट हैंडलर नहीं है

जेएस क्लिक क्यों काम करता है? जेएस क्लिक जेएसआई को सीधे ब्राउज़र में इंजेक्शन की तरह है 2 तरीकों से संभव,

मुट्ठी devtools कंसोल के माध्यम से है (हाँ, WebdriverJS devtools के सांत्वना के साथ comunicating) है

दूसरा HTML में सीधे <script> टैग इंजेक्ट कर रहा है।

प्रत्येक ब्राउज़र के लिए व्यवहार में अंतर होगा। परन्तु, ये तरीकों बटन पर क्लिक करने की तुलना में अधिक जटिल हैं। क्लिक करें जो पहले से मौजूद है (अंत-उपयोगकर्ता का क्लिक) का उपयोग कर रहा है, जेएस क्लिक पिछले दरवाजे के माध्यम से जा रहा है

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

जब ऐसा हो रहा है और इस समाधान के नकारात्मक पक्ष (यदि कोई हो) है?

=> जैसा कि ऊपर उल्लेख किया गया है, दोनों एक उद्देश्य के लिए मतलब है, लेकिन किस प्रवेश द्वार का उपयोग करने के बारे में:

  • क्लिक करें: ब्राउज़र का डिफ़ॉल्ट रूप से क्या प्रदान करता है
  • जे एस क्लिक: पिछले दरवाजे के माध्यम से जा रहा है

=> प्रदर्शन के लिए, यह कहना मुश्किल है क्योंकि यह ब्राउज़र पर भरोसा करता है लेकिन सामान्य रूप से:

  • क्लिक करें: तेजी से मतलब नहीं है, लेकिन केवल सीपीयू एक्सकेटेक्शन कार्य की शेड्यूल सूची में उच्च स्थान पर हस्ताक्षर किए गए हैं।
  • जेएस क्लिक: इसका मतलब धीमा नहीं है, लेकिन केवल सीपीयू कार्य की शेड्यूल सूची की अंतिम स्थिति में हस्ताक्षर किए गए हैं।

=> डाउनसाइड्स:

  • क्लिक करें: फ़ैमटॉम जे एस का प्रयोग कर रहे हैं, इसके अलावा कोई भी नकारात्मकता नहीं है।
  • जे एस क्लिक करें: स्वास्थ्य के लिए बहुत बुरा आप अकसर उन दृश्यों पर क्लिक कर सकते हैं जो दृश्य पर नहीं हैं। जब आप इसका उपयोग करते हैं, सुनिश्चित करें कि तत्व मौजूद है और देखने के लिए उपलब्ध है और अंत उपयोगकर्ता के दृष्टिकोण के रूप में क्लिक करें।

पीएस अगर आप समाधान की तलाश कर रहे हैं

  • PhantomJS का प्रयोग? मैं इसके बजाय क्रोम का उपयोग करने का सुझाव देगा। हां, आप उबंटु पर क्रोम रहित नहीं रख सकते थिंग क्रोम की तरह चलते हैं, लेकिन फ़ैंटमजेएस जैसी केवल एक दृश्य और कम छोटी गाड़ी नहीं है
  • Phamtomjs का उपयोग नहीं करते लेकिन यह अभी भी समस्या है? मैं browser.wait() साथ एक्सट्रैक्टर के अपेक्षित कंडीशन का सुझाव देता हूं। browser.wait() ( अधिक जानकारी के लिए इसे देखें )

(मैं इसे कम करना चाहता हूं, लेकिन बुरी तरह समाप्त हो गया है। सिद्धांत से संबंधित कुछ भी जटिलता को समझाते हैं …)