2010-09-06 5 views
1

J'essaie d'obtenir Selenium RC opérationnel pour effectuer des tests automatisés sur mon site Web. Je constate que je veux constamment vérifier que je n'ai pas cassé toutes les fonctionnalités, et les tests manuels commencent à devenir fastidieux. Toutefois, je n'arrive pas à faire fonctionner Selenium RC avec WaitForPageToLoad.Selenium RC WaitForPageToLoad se bloque

J'ai essayé de copier l'exemple de base qu'ils donnent dans la documentation du sélénium, mais le test reste toujours bloqué à: $ this-> waitForPageToLoad ("30000"); Je peux voir que cela va si loin dans la fenêtre qu'il apparaît et que la page semble avoir été chargée correctement (nous sommes sur une page de résultats de recherche google). Mais le test échoue avec un timeout.

require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; 

/** 
* Description of Test 
* 
* @author brian 
*/ 
class Test extends PHPUnit_Extensions_SeleniumTestCase { 

    function setUp() { 
     $this->setBrowser("*safari"); 
     $this->setBrowserUrl("http://www.google.com/"); 
    } 

    function testMyTestCase() { 
     $this->open("/"); 
    $this->type("q", "selenium rc"); 
    $this->click("btnG"); 
    $this->waitForPageToLoad("30000"); 
    $this->assertTrue($this->isTextPresent("Results * for selenium rc")); 
    } 
} 

Ce qui est encore plus intéressant est que si j'actualisez la page quand il est en attente, tout se poursuit comme prévu. Il semblerait donc que waitForPageToLoad ne réalise pas que la page a déjà été chargée.

Répondre

5

L'exemple de la documentation de Selenium RC est obsolète. Google a changé la façon dont leur page d'accueil a fonctionné il y a un certain temps, et ce n'est plus une simple page HTML. Appuyer sur le bouton de recherche est maintenant une opération de type AJAX qui envoie la requête de recherche et récupère une réponse JSON qui est traitée par le code JavaScript dans la page. Ainsi, la page n'est jamais rechargée et WaitForPageToLoad() expire éventuellement.

+0

Merci! Je n'avais pas réalisé que c'était le problème. J'ai pensé que leur exemple serait à jour. Tout semble fonctionner maintenant. – Brian

+0

Wow! Merci, m'a sauvé beaucoup de temps! – Soph

1

Il y a aussi une autre cause possible de cette situation que j'ai rencontrée tout à l'heure. Selon le documentation, si vous appelez TOUT COMMANDES SELENIUM entre le chargement d'une page et l'appel waitForPageToLoad, alors il est possible que waitForPageToLoad se bloqueront. (Si je comprends bien, c'est techniquement une condition de concurrence entre le script de test et le serveur sélénium, donc ça arrive parfois, pas forcément tout le temps).

Dans la plupart des cas, le chargement de la page est provoqué par un événement de clic. Lorsque vous avez un script de test comme:

$this->click("/some/path"); 
// <<- NO SELENIUM COMMANDS HERE 
$this->waitForPageToLoad("30000"); 

Assurez-vous de plus que les commandes ne se sélénium jamais inséré accidentellement dans la zone marquée.

Bien que ce ne soit pas techniquement le même problème que l'OP posté, il a le même message d'erreur, et je ne pouvais pas trouver cette information sans creuser un peu autour. Espérons que cela soit plus facile à trouver pour d'autres personnes dans le futur.

0

J'ai observé le même problème plusieurs fois. Par conséquent, je n'ai pas utilisé cette commande lorsque l'utilisateur ne navigue pas loin de la page en cours. Il se bloque à certains moments et utilise IsElementPresent dans while loop et quitte après lui renvoyer true.

0

Un alernatif à "WaitForPageToLoad()" est d'attendre qu'un élément soit présent.


    $SECONDS = 360;

for ($second = 0; ; $second++) { 
    if ($second >= $SECONDS) $this->fail("TIMEOUT"); 
    try { 
     if ($this->isElementPresent("edit-submit")) break; 
    } catch (Exception $e) {} 

    sleep(1); 
} 

Ce code boucle pour 360 secondes, vérifier si la valeur (modifier soumettre) est présente à chaque seconde. ("Dormez (1)"). Il obtiendra essentiellement le même résultat que WaitForPageToLoad, mais vous pouvez spécifier une cible absolue.

Questions connexes