2012-05-17 12 views
12

परीक्षण के लिए सेलेनियम वेबड्राइवर 2.210 + जावा का उपयोग कर रहा हूं। मेरे पास जीमेल में सभी मेलों का चयन करने के लिए नमूना कोड है। लेकिन कोड एक फेंकता है "एलिमेंट वर्तमान में दिखाई नहीं दे रहा है और इसलिए" जब मैं वेबड्राइवर के माध्यम से यूआरएल प्राप्त करने के बाद 5sec देरी डालने का प्रयास करता हूं तो त्रुटि से बातचीत नहीं की जा सकती है। क्या यह कोड देरी से काम करना संभव है?मैं कैसे बच सकता हूं "तत्व वर्तमान में दिखाई नहीं दे रहा है और इसलिए" सेलेनियम वेबड्राइवर

driver.get("https://mail.google.com/mail/u/0/?shva=1#all"); 
     delay(5); ////*......Working fine without this...........*//// 
    driver.switchTo().frame(driver.findElement(By.id("canvas_frame"))); 
driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']")).click(); 

अग्रिम

+2

आपको यह समझने की कोशिश करने की आवश्यकता है (और हमें बताएं) ऐसा क्यों होता है। क्या पहली बार (!) '// div [@class = 'T-Jo-auh'] पृष्ठ पर तत्व कुछ समय बाद वास्तव में अदृश्य है? जब आप इसे फायरबग के साथ पाते हैं तो आप क्या देखते हैं? आप ' सूची = driver.findElements ("// div [@class =' ​​T-Jo-auh ']") की कोशिश कर सकते हैं; और फिर परीक्षण के द्वारा पहले दृश्य तत्व के लिए सूची में देखें ['isDisplayed () '] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html#isDisplayed%28%29) –

उत्तर

1

धन्यवाद मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन हर watir-webdriver तत्व है - (वस्तु) wait_until_present (टाइमआउट = 30) विधि।

यदि यह चरण वैकल्पिक है, आप दृश्यता के लिए जाँच करनी चाहिए:

element = driver.findElement(By.xpath("//div[@class = 'T-Jo-auh']")); 

if (element.isDisplayed()) { 
    element.click(); 
} 

कृपया ध्यान दें, मैं एक जावा गुरु नहीं हूँ, और कोड ऊपर का परीक्षण नहीं किया गया था। कोशिश करो।

+0

' wait_until_present() 'मौजूद नहीं है वेबड्राइवर में, लेकिन [इसी तरह से] किया जा सकता है (http://seleniumhq.org/docs/04_webdriver_advanced.html#explicit-and-implicit-waits)। यहां समस्या यह है कि तत्व मौजूद है, बस दिखाई नहीं दे रहा है (और उस स्थिति में, वेबड्राइवर इसके साथ बातचीत करने से इंकार कर देता है)।साथ ही, आपकी 'दृश्यमान() 'विधि को' isDisplayed()' –

+0

स्पष्टीकरण Slanec के लिए धन्यवाद कहा जाता है! जेएस के साथ दिखाई देने वाला तत्व बनाना धोखाधड़ी होगी? :) – GoobeMaster

1

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

0

सेलेनियम वेबड्राइवर को 2.20.0 पर डाउनग्रेड करने का प्रयास करें।

मुझे रूबी मणि संस्करण 2.21.0 और 2.21.2 के साथ समान त्रुटि मिली।

मेरे मामले में वेब ड्राइवर हमेशा पेज पर जोड़े जाने के मामले में button.visible? = false लौटाता है .एजाक्स कॉल।

मेरे परीक्षण पहले से लंबे समय तक काम करते हैं और कुछ भी संबंधित नहीं बदला है। तो मुझे लगता है कि यह वेबड्राइवर के वर्तमान संस्करण में एक बग है।

0

यदि आप jQuery का उपयोग करते हैं, तो आप जावास्क्रिप्ट का उपयोग कर क्लिक कर सकते हैं। "ड्राइवर", आप उदाहरण के एक org.openqa.selenium.firefox.FirefoxDriver के लिए उपयोग कर सकते हैं के रूप में

public static void jqClick(String selector, JavascriptExecutor driver) { 
    driver.executeScript("$('" + selector + "').click()"); 
} 

: मैं तत्वों है कि WebDriver लगाने के लिए मना कर दिया पर क्लिक के लिए इस सरल सहायक बनाया।

यह एकमात्र समाधान था जो मेरे लिए काम करता था।

17

क्या आप वाकई सही तत्व को देख रहे हैं? मुझे एक ही समस्या थी और यह पता चला कि पृष्ठ पर दो समान तत्व थे, एक दृश्यमान और दूसरा नहीं। FindElement फ़ंक्शन उस व्यक्ति को वापस कर रहा था जो दिखाई नहीं दे रहा था।

मैंने FindElement के बजाय FindElements का उपयोग करके और फिर दिखाई देने वाले को निकालने के लिए लिंक का उपयोग करके इसे हल किया।

+1

सबूत पहले स्थान पर नहीं सोचेंगे। धन्यवाद ! :-) –

+1

"मैंने FindElements के बजाय FindElements का उपयोग करके इसे हल किया"। शायद एक FindElements कुछ और होना चाहिए? –

+0

यह "FindElement के बजाय FindElements" होना चाहिए था :) – Kesty

3

वैकल्पिक रूप से, आप सेलेनियम में प्रदान की गई जावास्क्रिप्ट एक्स्सेलर क्लास का उपयोग कर सकते हैं। ऐसा करने के बाद, आप वेब पेज पर डीओएम में हेरफेर करने के लिए किसी भी जावास्क्रिप्ट को निष्पादित कर सकते हैं।

रेफरी :: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.html

0

मेरे मामले (PhantomJSDriver सी # में सेलेनियम WebDriver से कहा जाता है) में मैं विंडो आकार सेट करने के लिए तत्व दिखाई दे सकता है के लिए काफी बड़ी होना ही था:

driver.Manage().Window.Size = new Size(1000, 800); 

मैं दृश्यता बदलकर https://github.com/ariya/phantomjs/issues/11637

0
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("document.getElementById('id').setAttribute('visibility', 'true');"); 

driver.findElement(By.id("id")).click(); 

: कि वैकल्पिक हल यहाँ मुद्दों के माध्यम से पढ़ने का पता चला तत्व का आप अपना कार्य कर सकते हैं। आप या तो सेलेनियम के साथ या JavascriptExecutor साथ क्लिक कर सकते हैं

4
यहाँ

है आप समस्या (कोणमापक/जावास्क्रिप्ट में उदाहरण) से निपटने के लिए क्या कर सकते हैं चीजों का एक सारांश:

  • maximize the browser window (पर क्रोम + मैक, वर्तमान में आप have to do it differently):

    browser.driver.manage().window().maximize(); 
    
  • को सत्यापित लोकेटर मिलता-जुलता कोई अन्य तत्वों देखते हैं कि। यदि आप वास्तव में अदृश्य है तो लोकेटर से मेल खाने वाला कोई अन्य तत्व है तो आप यह त्रुटि प्राप्त कर सकते हैं। element to be clickable के लिए

  • इंतजार:

    var EC = protractor.ExpectedConditions, 
        elm = element(by.id("myid")); 
    
    browser.wait(EC.elementToBeClickable(elm), 5000); 
    
  • तत्व की scroll into view:

    var elm = element(by.id("myid")); 
    browser.executeScript("arguments[0].scrollIntoView();", elm); 
    
  • क्लिक via javascript:

    var elm = element(by.id("myid")); 
    browser.executeScript("arguments[0].click();", elm); 
    
  • तत्व के इस कदम और "ब्राउज़र कार्रवाई" के माध्यम से क्लिक करें:

    var elm = element(by.id("myid")); 
    browser.actions() 
        .mouseMove(elm) 
        .click() 
        .perform(); 
    
0

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

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