2009-09-22 5 views
2

Lorsque j'appelle la méthode Open ("[some URL]") dans Selenium, il attend que toutes les ressources (images, CSS, JS) soient téléchargées. Mais comment sait-on que le navigateur est fait en demandant des ressources?La fonction Open de Selenium attend quoi?

Voici mon bout de code du pilote (en C#):

DefaultSelenium selenium = new DefaultSelenium(
    "localhost", 4444, "*iexplore", "http://www.stackoverflow.com"); 

// open my profile page 
selenium.Open("http://stackoverflow.com/users/111934/jeff-meatball-yang"); 

L'URL ci-dessus est par exemple seulement. Dans le cas où j'ai un appel AJAX enveloppé dans un très long délai dans un setTimeout() déclenché dans le gestionnaire d'événement onload du corps, Selenium n'attendra pas réellement cet appel AJAX avant de continuer ... Je dois manuellement dire à Selenium d'attendre en utilisant WaitForPageToLoad(timeout).

Alors, comment le sélénium détecte-t-il lorsqu'une page normale (sans AJAX) a fini de charger?

Répondre

2

Je crois qu'il attend que location.href soit disponible, ce qui signifie que si vous avez AJAX exécuté après ce point, vous devrez également utiliser waitForCondition.

selenium.open("http://www.example.com/"); 
selenium.waitForCondition("var value = selenium.getText('id=pageLoadStatus'); value == 'Loaded'", "60000"); 

Ci-dessous le code de détection de charge de la page courante du noyau Sélénium:

this.recordPageLoad = function(elementOrWindow) { 
    LOG.debug("Page load detected"); 
    try { 
     if (elementOrWindow.location && elementOrWindow.location.href) { 
      LOG.debug("Page load location=" + elementOrWindow.location.href); 
     } else if (elementOrWindow.contentWindow && elementOrWindow.contentWindow.location && elementOrWindow.contentWindow.location.href) { 
      LOG.debug("Page load location=" + elementOrWindow.contentWindow.location.href); 
     } else { 
      LOG.debug("Page load location unknown, current window location=" + this.getCurrentWindow(true).location); 
     } 
    } catch (e) { 
     LOG.error("Caught an exception attempting to log location; this should get noticed soon!"); 
     LOG.exception(e); 
     self.pageLoadError = e; 
     return; 
    } 
    self.newPageLoaded = true; 
}; 
+0

Merci Commandant Dave. :) Pouvez-vous me diriger vers le fichier ou l'adresse SVN où vous avez trouvé ceci? –

+0

De rien! http://code.google.com/p/selenium/source/browse/selenium-core/trunk/src/main/resources/core/scripts/selenium-browserbot.js#83 –

+0

Vous pouvez également utiliser ['waitForElementPresent' ] (http://release.seleniumhq.org/selenium-core/1.0.1/reference.html#storeElementPresent) après avoir appelé 'open'. – ma11hew28

1

@ Dave Hunt, you're correct that recordPageLoad is called, mais il enregistre simplement l'emplacement de chargement des pages (location.href) si elle est disponible et fixe self.newPageLoaded = true, la valeur renvoyée par isNewPageLoaded et, par conséquent, par doOpen.

isNewPageLoaded est appelé à selenium-api.js par _isNewPageLoaded < = makePageLoadCondition < = doOpen. Et, doOpen est invoqué après Selenium IDE exécute la commande open.

La trace pertinente est:

doOpen appels (déplacement à selenium-browserbot.js) openLocation =>getCurrentWindow =>_modifyWindow =>modifySeparateTestWindowToDetectPageLoads (qui, selon le commentaire au-dessus, attend « en permanence par sondages jusqu'à ce que le document change et entièrement chargé ") =>pollForLoad =>getReadyState.

getReadyState renvoie les document.readyState (rs) et pollForLoad attend jusqu'à ce que rs == 'complete', à savoir, jusqu'à ce que la page a complètement chargée, les images et tous.

Ace Ventura l'explique mieux que je peux.


P.S. @Dave Hunt, merci pour votre Selenium IDE Flow Control script on GitHub. C'est très pratique! :)

Questions connexes