2010-08-25 4 views
1

J'écris des tests Selenium en Java, et j'essaie surtout d'utiliser des vérifications plutôt que des assertions parce que les choses que je vérifie ne sont pas très dépendantes donc je ne veux pas avorter si une petite chose ne fonctionne pas. Une des choses que je voudrais garder à l'œil est de savoir si certaines pages de Drupal prennent une éternité à charger. Quelle est la meilleure façon de faire cela?Meilleure façon de chronométrer quelque chose dans Selenium

Petit exemple du modèle que j'utilise.

selenium.open("/m"); 
selenium.click("link=Android"); 
selenium.waitForPageToLoad("100000"); 
if (selenium.isTextPresent("Epocrates")) { 
     System.out.println("  Epocrates confirmed"); 
} else { 
     System.out.println("Epocrates failed"); 
} 

Dois-je avoir deux déclarations « waitForPagetoLoad » (par exemple, 10000 et 100000) et si le texte souhaité ne se présente pas après le premier, imprimer une déclaration? Cela semble maladroit. Ce que je voudrais faire est juste une ligne comme

if (timeToLoad>10000) System.out.println("Epocrates was slow"); 

Ensuite, continuez à vérifier si le texte était présent ou non.

Répondre

1

waitForPageToLoad attendra jusqu'à ce que la page suivante soit chargée. Ainsi, vous pouvez juste faire une minuterie de début/fin et faites votre si:

long start = System.currentTimeMillis(); 
selenium.waitForPageToLoad("100000"); 
long timeToLoad= (System.currentTimeMillis()-start); 
if (timeToLoad>10000) System.out.println("Epocrates was slow"); 
+0

Merci. Je me demandais s'il y avait un moyen plus sélénium-natif de le faire, mais je peux simplement le regrouper dans ma propre fonction et avoir le même résultat. – eom

0

Votre texte est-il chargé après le chargement de la page? Je veux dire, le texte est-il inséré dynamiquement? Sinon, le texte devrait être présent dès que la page a été chargée.

selenium.isTextPresent 

n'attend pas. Il vérifie seulement la page actuellement disponible.

0

La meilleure méthode pour attendre quelque chose en Sélénium est comme suit:

 Reporter.log("Waiting for element '" + locator + "' to appear."); 
    new Wait() 
    { 
     public boolean until() 
     { 
      return selenium.isElementPresent(locator); 
     } 
    }.wait("The element '" + locator + "' did not appear within " 
      + timeout + " ms.", timeout); 

Le serveur est une partie du sélénium, vous ne dois l'importer.

Voici également un cadre que vous pouvez utiliser. C'est opensource, gère presque tout et peut être facilement étendu.

https://sourceforge.net/projects/webauthfw/

Utilisez bien et nous donner du crédit hehe. :)

Cheers, Gergely.

+0

Cela serait utile si vous pouviez trouver un moyen d'encapsuler cette attente autour d'une méthode de test en utilisant la POO. La façon dont vous l'avez écrit ci-dessus ne me semble pas très utile. Il serait préférable d'avoir une méthode timed appelée par une méthode wrapper (en utilisant System.currentTimeMillis()) tant que la méthode que vous appelez est à sécurité exception. – djangofan

+0

@djangofan Je suis sûr qu'après 4 ans, il doit y avoir quelque chose qui l'enveloppe. ;) – Hannibal

0

Dans un Selenium integration test, je l'ai fait comme si, en utilisant nano-temps et la conversion en double pour obtenir secondes:

long endTime = System.nanoTime(); 
long duration = (endTime - startTime); 
Reporter.log("Duration was: " + ((double)duration/1000000000.0) + " seconds.", true); 
assertTrue(duration >=0 || duration <= 1000, "Test that duration of default implicit 
    timeout is less than 1 second, or nearly 0."); 
Questions connexes