selenium find_elements_by_xpath WebDriver findElement par xPath, pas TIMEOUT si l'élément n'est pas trouvé, l'écran se bloque juste là.



xpath text (4)

Je suis confronté à un problème où le test se bloque (le navigateur est ouvert et ne peut pas passer le test suivant) en raison de mon instruction de test incapable de trouver l'élément.

Mon TestStatemet aime ceci:

driver.findElement(By.xpath("//input[@name='AID' and contains(@value,'sampleDataThatwillNotFound')]"));

Le test se bloque uniquement lorsque trouvé par XPATH, aucun problème lors de la recherche par NAME / ID. J'avais mis le délai d'attente à 60 secondes, après les 60 secondes, il pend toujours.

Quelqu'un là-bas face à ce problème avant? ou N'importe qui a eu une idée de comment résoudre ce problème?


J'ai essayé quelques réponses ci-dessus, mais ayant toujours les mêmes problèmes .. je reviens à la version 17.0.3 old firefox .... tout juste résoudre .. abit drôle .. ceux qui font face au même problème que vous pouvez essayer à FF Version 17.0 .3


J'ai reçu des commentaires de darrell de Google Groupes, et je suis d'accord avec lui, voici ses commentaires: https://groups.google.com/forum/#!topic/webdriver/Vt0DuQHOAg8

* Je n'ai pas vu ces locators suspendus mais tout est possible. Généralement, si le DOM est grand et / ou complexe, un localisateur de combinaison (un avec des éléments contenant plus et un) pourrait le rendre vraiment lent. Mon expérience générale a été d'autant plus complexe que le localisateur a pris du temps. Plus il prend de temps, plus il est probable que vous verrez une exception NoSuchElementException. Il se pourrait que quelque chose d'autre que vous faites cause un deuxième problème, à savoir la pendaison. Une déclaration et est en train de se multiplier. Donc @ name = 'AID' est relativement rapide. Il n'y a pas de vérification de sous-chaîne. Cela correspond ou non. Donc, ce localisateur fonctionnera dans l'ordre n, où n est le nombre d'étiquettes d'entrée. Un localisateur tel que contains (@value, 'someString') devra analyser chaque tag pour chaque attribut pour une correspondance avec toutes les sous-chaînes possibles. Si la méthode contains () est bien implémentée, elle peut être un peu plus rapide que la force brute, mais le type de données dans le DOM déterminera la durée de cette recherche. Ce sera certainement lent. Maintenant, si vous prenez la recherche contains () (relative lente) et la correspondance exacte (relativement rapide), alors cherchez l'AND des deux correspondances, vous les multipliez. Deux correspondances exactes vont être ordonnées n fois l'ordre n (ou n au carré). Ce n'est pas bien. Une correspondance exacte des temps d'un contenu est VRAIMENT mauvaise. Selon le DOM, il pourrait être ordonné en cubes. Cela signifie que si n prend 10 secondes, n cubed est 10 * 10 * 10 secondes (1000 secondes ou plus de 16 minutes). Si le DOM fait que les choses sont encore pires, vous pourriez regarder la correspondance exacte avec les secondes et la combinaison avec les heures. Darrell *

Donc, pour résoudre ce problème, je pense qu'il est temps de faire respecter l'équipe de développement à appliquer à la pratique de développement commun de mettre en ID unique pour chaque élément / contrôle. De sorte que le script d'automatisation de test peut directement effectuer n'importe quel ID de vérification / entrée au lieu de xPath.


Eh bien, j'ai eu le même problème et je l'ai trouvé dans doc api webdriver : findElement ne devrait pas être utilisé pour rechercher des éléments non présents, utiliser findElements(By) et affirmer une réponse de longueur zéro à la place.

Donc j'utilise quelque chose comme

List<WebElement> found = driver.findElements(By.id("elementid"));
if (found.size() > 0) 
{
    // get the 1st element
} else {
    // time out
}

pour résoudre ce problème. Et timeout implicite fonctionne très bien avec findElements dans mon cas.


J'avais le même problème après la mise à jour de Firefox (25 à 26) et Selenium (2.37.1 à 2.39.0 pilote + serveur). Pas d'exception levée, blocage indéfini, etc. Il a été résolu en supprimant la déclaration implicitlyWait . Pas une vraie solution mais assez bonne dans mon cas.