2013-06-02 8 views
17

मैं सेलेनियम-वेबड्रिवरज का उपयोग कर रहा हूं। मैं इस प्रकार है जिसके लिए मैं एक स्पष्ट इंतजार बनाया है प्रदर्शित करने के लिए एक निश्चित तत्व के लिए इंतजार करना चाहते हैं और यह सिर्फ ठीक काम करता है,सेलेनियम वेबड्राइवर जेएस - स्पष्ट प्रतीक्षा

var displayed = false; 
driver.wait(function(){ 
    driver.findElement(locator).isDisplayed().then(function(value){ 
     displayed = value; 
    }); 
    return displayed; 
}, timeout); 

यह सबसे अच्छा मैं कर सकता हूँ है या ऐसा करने के लिए एक बेहतर तरीका है ? कारण मैं पूछता हूं कि पहली बार प्रतीक्षा कॉलबैक को बुलाया जाता है (मेरे मामले में) यह हमेशा झूठी वापसी करेगा। केवल बाद में जब प्रदर्शन किया गया वादा निष्पादित किया जाता है तो प्रदर्शित परिवर्तन का मूल्य होगा।

उत्तर

25

आपका कोड अतुल्यकालिक कॉलबैक के साथ एक तुल्यकालिक वापसी मिश्रण है, निम्नलिखित कोड सही काम करना चाहिए:

return driver.wait(function() { 
    return driver.findElement(locator).isDisplayed(); 
}, timeout); 

भीतरी समारोह एक वादा है कि driver.wait के लिए इंतजार करेंगे और इसके मूल्य ले जाएगा वापस आ जाएगी (सच/झूठी) प्रतीक्षा की स्थिति के रूप में।

+0

आप सही हैं के निर्माता हूँ। मैं अभी भी वादे करने के लिए उपयोग कर रहा हूं ... –

+0

हैलो दोस्तों, इस समाधान ने मुझे 'त्रुटि: यह डिफर्ड पहले ही हल कर लिया है।' क्या यह आपके लिए काम करता है? – haejeong87

+8

इसके बजाय, 'driver.isElementPresent (लोकेटर); 'मेरे लिए काम किया है, जो आप इस समाधान का उपयोग नहीं कर सकते हैं :) – haejeong87

3

webdriver और जे एस के अतुल्यकालिक जायके में शामिल भ्रम की ज्यादा बचने के लिए आप webdriver-सिंक एक कोशिश दे सकता है: https://npmjs.org/package/webdriver-sync

यह मेरा अनुभव है कि webdriver एपीआई के async संस्करणों को पढ़ने के लिए मुश्किल हो गया है बहुत से नेस्टेड कॉलबैक के बाद।

यह निश्चित रूप से मानता है कि आपके पास अतुल्यकालिक रहने की आवश्यकता नहीं है।

अस्वीकरण: मैं सॉफ्टवेयर के इस टुकड़े (webdriver-सिंक)

+2

आपको वेबड्राइवर जेएस (https://code.google.com/p/selenium/wiki/WebDriverJs) आज़माएं जो सेलेनियम लोगों द्वारा प्रदान किए गए वेबड्राइवर का "आधिकारिक" जावास्क्रिप्ट संस्करण है। इसके अतिरिक्त, वेबड्राइवर जेएस को "वादा प्रबंधक" प्रदान करने में मुश्किल नहीं है जो आपको "नियंत्रण प्रवाह" (https://code.google.com/p/selenium/wiki) का उपयोग करके सिंक तरीके से अपने कोड को लिख/निष्पादित करने देता है।/WebDriverJs # Control_Flows)। इसका उपयोग करके, आपका कोड और भी पठनीय होगा! –

+0

@ सीएसएन, मुझे सचमुच प्यार है कि वेबड्राइवर जेएस टीम ने जितना संभव हो सके सिंक्रोनस को देखने का प्रयास किया है; हालांकि, जैसा कि उल्लेख किया गया था [http://stackoverflow.com/questions/16882860/selenium-webdriver-js-explicit-wait/18797176?noredirect=1#comment32167323_16882922), अक्सर यह जानना भ्रमित होता है कि तुल्यकालिक क्या है और क्या नहीं है। एक वादे आधारित दृष्टिकोण के साथ भी, आप अभी भी उन परिदृश्यों के साथ समाप्त होते हैं जहां आप नेस्टेड कॉलबैक में पड़ते हैं (जैसे किसी तत्व के टेक्स्ट को पुनर्प्राप्त करने के बाद कुछ करना)। – jsdevel

+0

[यहां] (https://gist.github.com/jsdevel/99a5d736fbdd6c86d455) एक ऐसी गलती है जो 'वेबड्राइवर-सिंक' का उपयोग करके पूरी तरह सिंक्रोनस तरीके से लिखे गए समाधान का एक संस्करण दिखाती है। – jsdevel

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