9

मुझे पता है कि मैं जावास्क्रिप्ट चलाने के लिए सेलेनियम 2 का वेबड्राइवर प्राप्त कर सकता हूं और वापसी मूल्य प्राप्त कर सकता हूं लेकिन इतनी असीमित चीजें हो रही हैं, मैं जावास्क्रिप्ट को दूसरी तरफ सेलेनियम से बात करना चाहता हूं। मैंने कुछ खोज किया है और इस तरह कुछ नहीं मिला है। क्या लोग आम तौर पर implicitly_wait का उपयोग करते हैं? ऐसा लगता है कि यह सब कुछ समय के लिए संभव नहीं है क्योंकि विफल होने की संभावना है? परफेक्ट उदाहरण सेलेनियम को पता होना चाहिए कि जब एक एक्सएचआर पूरा हो जाता है या अनिश्चित निष्पादन समय के साथ एक असीमित एनीमेशन होता है।क्या जावास्क्रिप्ट सेलेनियम 2 से बात कर सकता है?

क्या यह संभव है? हम सॉसेलेबस पर पाइथन के साथ सेलेनियम 2 का उपयोग कर रहे हैं।

उत्तर

8

आपको execute_async_script() विधि (Java में जावास्क्रिप्टExecutor.executeAsyncScript, IJavaScriptExecutor.ExecuteAsyncScript() .NET में देखना चाहिए, जो आपको कॉलबैक फ़ंक्शन की प्रतीक्षा करने की अनुमति देता है। कॉलबैक फ़ंक्शन स्वचालित रूप से आपके जावास्क्रिप्ट फ़ंक्शन में arguments सरणी में जोड़ा जाता है। तो, यह सोचते हैं आप पृष्ठ है कि अपनी इच्छानुसार कोई शर्त जब तक इंतजार कर रहा है पर एक JavaScript फ़ंक्शन पहले से ही है, तो आप निम्नलिखित की तरह कुछ कर सकते हैं (जावा नीचे कोड, C# और पायथन कोड समान होना चाहिए):

String script = "var callback = arguments[arguments.length - 1];" 
    + "callback(myJavaScriptFunctionThatWaitsUntilReady());"; 

driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS); 
((JavascriptExecutor)driver).executeAsyncScript(script); 

यह हो सकता है और भी चालाक होना संभव है और कॉलबैक फ़ंक्शन को सीधे उस ईवेंट पर पास करें जो उचित डेटा देता है। आप प्रोजेक्ट JavaDocs में executeAsyncScript() फ़ंक्शन पर अधिक जानकारी प्राप्त कर सकते हैं, और प्रोजेक्ट स्रोत पेड़ में इसके लिए नमूना कोड पा सकते हैं। this file में परीक्षणों में एक एक्सएचआर को पूरा करने का इंतजार करने का एक शानदार उदाहरण है।

यदि यह सॉसलैब्स के उपयोग के लिए उपलब्ध पायथन बाइंडिंग के संस्करण में अभी तक उपलब्ध नहीं है, तो मुझे उम्मीद है कि यह लंबे समय से पहले उपलब्ध होगा। माना जाता है कि, एक अर्थ में, यह आपके परीक्षण मामले से जावास्क्रिप्ट में "वांछित स्थिति के लिए मतदान" को दबा रहा है, लेकिन यह आपके परीक्षण को और अधिक पठनीय बना देगा।

+1

ये महान सुझाव हैं धन्यवाद। –

2

अत्यधिक ब्लंट नहीं होना चाहिए, लेकिन यदि आप चाहते हैं कि आपकी ऐप आपके टेस्ट रनर से बात करे, तो आप इसे गलत कर रहे हैं।

यदि आपको एक्सएचआर खत्म करने की प्रतीक्षा करनी है, तो आप स्पिनर प्रदर्शित करने का प्रयास कर सकते हैं और फिर परीक्षण कर सकते हैं कि एक सफल अनुरोध को इंगित करने के लिए स्पिनर गायब हो गया है।

एनीमेशन के संबंध में, जब एनीमेशन पूरा हो गया है, तो शायद इसकी कॉलबैक एक वर्ग जोड़ सकती है जो दर्शाती है कि एनीमेशन समाप्त हो गया है और फिर आप उस वर्ग के अस्तित्व के लिए परीक्षण कर सकते हैं।

+1

दोनों मामलों में आप समय के हिस्से को अनदेखा कर रहे हैं। जावास्क्रिप्ट असीमित है। मैं नहीं पूछ रहा हूं कि सेलेनियम की चीजों की जांच कैसे करें, मैं पूछ रहा हूं कि कब जांचना है। एक प्रश्न जिसका आपने उत्तर नहीं दिया है। चूंकि जावास्क्रिप्ट एसिंक्रोनस है, इसलिए जावास्क्रिप्ट तैयार होने पर सबसे अच्छा समय होता है और केवल जावास्क्रिप्ट ही जानता है। एक हुक इसे करने का सबसे अच्छा तरीका है। तो क्या कोई है? –

+2

सेलेनियम 1 और 2 के साथ अपने अनुभव में, आपका परीक्षण आपके ऐप में एक एसिंक्रोनस कॉल ट्रिगर करता है। फिर आप तत्व के अस्तित्व की प्रतीक्षा करने के लिए प्रतीक्षा_for कमांड का उपयोग करते हैं (या अस्तित्व में नहीं है)। यदि आप सेलेनियम की मौजूदगी की अपेक्षा करने के लिए अपना ऐप लिखते हैं, तो मुझे लगता है कि आप गलत तरीके से समस्या का सामना कर रहे हैं। आपके ऐप को उस मामले के लिए सेलेनियम, या किसी अन्य परीक्षण ढांचे की परवाह नहीं करनी चाहिए। यदि भविष्य में कुछ भी बेहतर हो जाता है तो इससे भविष्य में परीक्षण धावकों को स्वैप करने की अनुमति मिलती है। –

+2

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

3

सैद्धांतिक रूप से यह संभव है, लेकिन मैं इसके खिलाफ सलाह दूंगा।

समाधान शायद उस साइट पर कुछ jQuery चल रहा है जो जावास्क्रिप्ट प्रोसेसिंग समाप्त होने पर एक चर को सत्य पर सेट करता है।

सेलेनियम एक getEval के माध्यम से लूप तक सेट करें जब तक कि यह चर सत्य न हो और फिर सेलेनियम में कुछ करें।

यह आपकी आवश्यकताओं को पूरा करेगा लेकिन यह वास्तव में एक बुरा विचार है। अगर किसी कारण से आपका jQuery ट्रिगर वैरिएबल को सत्य (या जो भी राज्य आप उम्मीद करते हैं) सेट नहीं करता है तो सेलेनियम वहां अनिश्चितता से बैठेगा। आप उस पर वास्तव में एक लंबा समय लगा सकते हैं, लेकिन फिर सेलेनियम प्राप्त करने के लिए अलग-अलग क्या होगा और एक विशिष्ट तत्व के प्रकट होने की प्रतीक्षा करें?

ऐसा लगता है कि आप अपने समाधान को अतिरंजित करने की कोशिश कर रहे हैं और इससे आपको भविष्य में और अधिक दर्द मिलेगा बहुत कम लाभ।

+1

आप सेलेनियम के साथ मतदान का सुझाव दे रहे हैं जो एक ही बात नहीं है। मैं सोच रहा था कि क्या सेलेनियम के पास कोई हुक था जिसे उसने साइट पर जोड़ा था। मुझे आश्चर्य है कि यह नहीं करता है। फ़्लैश फ्लैश में फ़्लैश फ्लैश भी है। –

+1

सेलेनियम साइट को संशोधित नहीं करता है, यह सिर्फ डोम और एचटीएमएल को देखता है। आप जो भी करना चाहते हैं वह एकमात्र तरीका है जिसे आप किसी भी तरह से डोम में जोड़कर और फिर सेलेनियम प्राप्त कर सकते हैं ताकि आपके परिवर्तन के लिए डोम की जांच हो सके। आप अपनी वेबसाइट से सेलेनियम ड्राइव नहीं कर सकते हैं। – Ardesco

+1

आप अपनी वेबसाइट से सेलेनियम ड्राइव नहीं कर सकते हैं। तब मेरा जवाब है। यह मेरी राय में ऐसा करना चाहिए, लेकिन नहीं। धन्यवाद! –

1

सेलेनियम के साथ परीक्षण एनीमेशन वर्म्स का एक खोल खोल रहा है।परीक्षण काफी भंगुर हो सकते हैं और कई झूठे सकारात्मक कारण बन सकते हैं।

समस्या यह है कि कॉल असीमित हैं, और पृष्ठ की स्थिति में व्यवहार और परिवर्तन को ट्रैक करना मुश्किल है।

मेरे अनुभव में एसिंक्रोनस कॉल इतना तेज़ हो सकता है कि स्पिनर कभी प्रदर्शित नहीं होता है, और पृष्ठ की स्थिति पूरी तरह से एक राज्य को छोड़ सकती है (सेलेनियम का पता लगा सकता है)।

संक्रमण की पृष्ठ की स्थिति की प्रतीक्षा करने से परीक्षण कम भंगुर हो सकता है, हालांकि झूठी सकारात्मक पूरी तरह से हटाया नहीं जा सकता है।

मैं एनीमेशन के लिए मैन्युअल परीक्षण की सलाह देता हूं।

संबंधित मुद्दे