2008-09-17 19 views
9

कुछ अज्ञात परिस्थितियों में सेलेनियम यह नहीं पता कि खुली विधि का उपयोग करते समय एक पृष्ठ लोड हो गया है। मैं जावा एपीआई का उपयोग कर रहा हूँ। उदाहरण के लिए (यह कोड इस त्रुटि उत्पन्न करेगा नहीं मैं एक बाहर से दिखाई देने पेज कि होगा के बारे में पता नहीं है।।): जब त्रुटि होती है, 'खुला' का समय समाप्त करने के लिए कॉलसेलेनियम कैसे प्राप्त होता है यह पहचानने के लिए कि एक पृष्ठ लोड किया गया है?

Selenium browser = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com"); 
browser.start(); 
browser.open("http://www.google.com/webhp?hl=en"); 
browser.type("q", "hello world"); 

, यहां तक ​​कि आप हालांकि स्पष्ट रूप से देख सकते हैं कि समय समाप्ति से पहले पृष्ठ सफलतापूर्वक लोड हो गया है। टाइमआउट बढ़ाने से मदद नहीं मिलती है। 'टाइप' पर कॉल कभी नहीं होता है, कोई प्रगति नहीं होती है।

सेलेनियम को यह पहचानने के लिए कैसे मिलता है कि यह त्रुटि तब होती है जब यह त्रुटि होती है?

उत्तर

1

जब मैं सेलेनियम परीक्षण करता हूं, तो मैं यह देखने के लिए प्रतीक्षा करता हूं कि कोई निश्चित तत्व दिखाई दे रहा है (प्रतीक्षा करें या दृश्यमान), तो मैं अपनी क्रिया करता हूं। मैं आमतौर पर टाइप करने के बाद एक तत्व का उपयोग करने का प्रयास करता हूं।

0

'मल्टीविंडो' सुविधा को सक्षम करने से समस्या हल हो गई, हालांकि मुझे स्पष्ट नहीं है कि क्यों।

SeleniumServer (int बंदरगाह, बूलियन slowResources, बूलियन multiwindow)

SeleniumServer server = new SeleniumServer(4444, false, true); 

किसी भी स्पष्टीकरण उपयोगी होगा।

0

IFrames के साथ किसी एप्लिकेशन का परीक्षण करने के लिए सेलेनियम का उपयोग करते समय मैंने इसी तरह के मुद्दों में भाग लिया है। असल में, ऐसा लगता है कि एक बार प्राथमिक पृष्ठ (iframes युक्त पृष्ठ) लोड हो जाने पर, सेलेनियम यह निर्धारित करने में असमर्थ था कि iframe सामग्री लोडिंग समाप्त हो गई थी।

उस लिंक के स्रोत को देखने से जो आप लोड करने का प्रयास कर रहे हैं, ऐसा लगता है कि कुछ जावास्क्रिप्ट है जो पृष्ठ लोड होने के बाद अतिरिक्त पृष्ठ तत्व बना रहा है। मैं निश्चित नहीं हो सकता, लेकिन यह संभव है कि यह समस्या का कारण बन रहा है क्योंकि यह उस स्थिति के समान लगता है जो मैंने ऊपर उठाया है।

क्या आपको एक स्थिर पृष्ठ लोड करने में समान त्रुटियां मिलती हैं? (यानी, सीधे एचटीएमएल के साथ कुछ)

यदि आप बेहतर उत्तर पाने में असमर्थ हैं, तो सेलेनियम मंचों को आजमाएं, वे आमतौर पर काफी सक्रिय होते हैं और सेलेनियम देव अच्छे सवालों का जवाब देते हैं।

http://clearspace.openqa.org/community/selenium_remote_control

इसके अलावा, अगर आप पहले से ही इसे करने की कोशिश नहीं की है, कॉल खोलने के लिए के बाद browser.WaitForPageToLoad ("15000") के लिए एक कॉल जोड़ें। मैंने पाया है कि प्रत्येक पृष्ठ संक्रमण के बाद ऐसा करने से मेरे परीक्षण थोड़ा और ठोस हो जाते हैं, भले ही इसे तकनीकी रूप से आवश्यक न हो। (जब सेलेनियम पता लगाता है कि पृष्ठ वास्तव में भरी हुई है, यह जारी है, इसलिए वास्तविक समय समाप्ति चर वास्तव में एक चिंता का विषय नहीं है ..

1

'खुला' चाल करना होगा के स्थान पर 'openAndWait' का उपयोग करना।

से website:।

कई कार्रवाइयां 'AndWait "प्रत्यय, उदाहरण के लिए" clickAndWait "के साथ कहा जा सकता है इस प्रत्यय सेलेनियम कि कार्रवाई ब्राउज़र सर्वर के लिए एक कॉल करने के लिए कारण होगा बताता है, और है कि सेलेनियम चाहिए एक नए पेज को लोड करने की प्रतीक्षा करें।

+1

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

+0

सहमत हैं, यह एक उपयोगी उत्तर नहीं है। जावा एपीआई में "... एंडवाइट" विधियां उपलब्ध नहीं हैं, लेकिन यहां पूरी समस्या यह है कि पृष्ठ लोड होने पर सेलेनियम सही तरीके से पता नहीं लगा रहा है। उन विधियों का उपयोग वैसे भी मदद नहीं करेगा। http://release.seleniumhq.org/selenium-core/0.8.0/reference.html#waitForPageToLoad – Hovis

2

मुझे हाल ही में इस समस्या का सामना करना पड़ा।

सभी जेएस-आधारित समाधान ICEFaces 2.x + सेलेनियम 2.x/वेबड्राइवर संयोजन में काफी फिट नहीं थे।

मैं क्या किया है और क्या मेरे लिए काम किया निम्नलिखित है:

स्क्रीन के कोने में, वहाँ कनेक्शन गतिविधि सूचक है।

  <ice:outputConnectionStatus id="connectStat" 
             showPopupOnDisconnect="true"/> 

मेरी जावा इकाई परीक्षण में, मैं फिर से वापस आता है अपनी 'निष्क्रिय' छवि तक इंतजार:

private void waitForAjax() throws InterruptedException { 
    for (int second = 0;; second++) { 
     if (second >= 60) fail("timeout"); 
     try { 
      if ("visibility: visible;".equals(
       selenium.getAttribute("top_right_form:connectStat:[email protected]"))) { 
       break; 
      } 
     } catch (Exception e) { 

     } 
     Thread.sleep(1000); 
    } 
} 

आप, उत्पादन निर्माण में इस सूचक का प्रतिपादन निष्क्रिय कर सकते हैं अगर यह पेज पर दिखा है अनावश्यक, या अपनी छवियों के रूप में खाली 1x1 gifs का उपयोग करें।

100% काम करता है (पॉपअप के साथ, संदेशों को धक्का दिया जाता है) और आपको अलग-अलग तत्वों के लिए प्रतीक्षाफोरमेंट (...) निर्दिष्ट करने के नरक से मुक्त करता है।

उम्मीद है कि यह किसी की मदद करेगा।

0

नहीं एक आदर्श समाधान है, लेकिन मैं इस विधि

$t1 = time(); // current timestamp 
$this->selenium->waitForPageToLoad(30); 
$t2 = time(); 

if ($t2 - $t1 >= 28) { 
    // page was not loaded 
} 

इसलिए, यह एक तरह से जाँच कर रहा है, तो पेज निर्दिष्ट समय के दौरान लोड नहीं हुई उपयोग कर रहा हूँ, तो यह लोड नहीं है।

0

आप पेज कोई AJAX है, पृष्ठ के पाद लेख तलाश करने के लिए प्रयास करते हैं (मैं भी JUnit fail("") उपयोग करते हैं, आप System.err.println() बजाय का उपयोग कर सकते):

element.click(); 
    int timeout =120; 
    // one loop = 0.5 sec, co it will be one minute 
    WebElement myFooter = null; 

    for(int i=0; i<timeout; i++){ 
     myFooter = driver.findElement(By.id("footer")); 
     if(myFooter!= null){ 
     break; 
     } 
     else{ 
     timeout--; 
     } 
} 
if(timeout==0 && myFooter == null){ 
    fail("ERROR! PAGE TIMEOUT"); 
} 
+0

'findElement()' अगर कोई पाद लेख तत्व नहीं मिला तो अपवाद फेंक देगा। आपको उन 60 प्रयासों को नहीं मिलेगा जिन्हें आपने वहां प्रोग्राम करने का प्रयास किया है। – Alexander

0

एक और विचार (AJAX API संशोधित करने के लिए कुछ पाठ जोड़ने के लिए है AJAX कार्यों के बाद)। ajax कार्रवाई के बाद वापसी से पहले समाप्त हो गया था, सही पर अदृश्य क्षेत्र निर्धारित करते हैं, सेलेनियम यह खोजने के लिए और पढ़ा जाएगा के रूप में हरे रंग की रोशनी

html में

:

<input type='hidden' id="greenlight"> 
सेलेनियम में

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){ 
    // do something after page loading 
} 
2

हो सकता है कि यह आपकी मदद करेगा ....

निम्नलिखित विधि पर विचार करें फंक्शंस.जावा

public static void waitForPageLoaded(WebDriver driver) { 

     ExpectedCondition<Boolean> expectation = new 
    ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver driver) { 
       return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete"); 
      } 
      }; 

      WebDriverWait wait = new WebDriverWait(driver,30); 
      try { 
        wait.until(expectation); 
      } catch(Throwable error) { 
        Assert.assertFalse(true, "Timeout waiting for Page Load Request to complete."); 
      } 
    } 

और आप इस विधि को अपने फ़ंक्शन में कॉल कर सकते हैं। चूंकि यह एक स्थिर विधि है, इसलिए आप सीधे कक्षा के नाम से कॉल कर सकते हैं।

public class Test(){ 
    WebDriver driver; 

    @Test 
    public void testing(){ 
     driver = new FirefoxDriver(); 
     driver.get("http://www.gmail.com"); 
     Functions.waitForPageLoaded(driver); 
    } 
} 
संबंधित मुद्दे

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