Comment puis-je obtenir Sélénium Web Chauffeur d'attendre pour qu'un élément soit accessible, et pas seulement présent?
Je suis en train d'écrire des tests pour une application web. Certaines commandes de traction, les boîtes de dialogue qui ont des contrôles qui sont visibles, mais n'est pas disponible pendant quelques instants. (Ils sont grisés, mais webdriver voit encore visible).
Comment puis-je savoir que le Sélénium pour attendre l'élément à fait accessible, et non pas seulement visible?
try:
print "about to look for element"
element = WebDriverWait(driver, 10).until(lambda driver : driver.find_element_by_id("createFolderCreateBtn"))
print "still looking?"
finally: print 'yowp'
Voici le code que j'ai essayé, mais il "voit" le bouton avant qu'il soit utilisable et essentiellement les frais à droite après la supposée "attendre".
Remarque que je peux farcir une dizaine de seconde de sommeil dans le code au lieu de cela, et le code fonctionne correctement, mais que c'est moche, peu fiables, et inefficace. Mais il n'prouver que le problème est juste que le "clic" de la commande est la course en avant de la disponibilité des contrôles.
- Pas de doute, il fonctionne correctement. Je suis en train de définir correctement ce qu'il devrait être en attente pour les. Dans ce cas, un élément spécifique, lorsqu'il est disponible, non seulement visible.
- Ouais, manque de précision de ma part. Je voulais dire mon test chargée la droite passé, lorsque j'ai voulu faire une pause. Faute couché avec moi en tant que programmeur, pas de sélénium comme l'outil.
- Cette question a sauvé mon travail.
- Juste une précision: je crois que le comportement par défaut de findElement en Sélénium est également à vérifier pour la visibilité. C'est différent que de vérifier pour la "présence" sur le DOM, ce qui peut renvoyer vrai même lorsque quelque chose n'est pas visible.
Vous devez vous connecter pour publier un commentaire.
Je suppose que les événements de calendrier qui va comme ceci:
<input type="button" id="createFolderCreateBtn" disabled="disabled" />
<input type="button" id="createFolderCreateBtn" />
Actuellement, vous êtes à la recherche de l'élément par son id, et vous en trouver un sur l'étape 2, qui est plus tôt que vous avez besoin. Ce que vous devez faire, c'est la recherche par xpath:
Voici la différence:
Pour conclure, voici votre code fixe:
Mise à JOUR:
Repasting la même chose avec le réel webdriver.
Voici la
example.html
code de la page:Voici la ipython session:
Mise à JOUR 2:
Il fonctionne avec ceci:
browser.page_source
valeur dans une variable juste après l'élément est trouvé. 2. stocker cette variable dans.html
fichier. 3. L'ouvrir avec google chrome/firefox et inspecter avec firebug/developer console.//input[@id="createFolderCreateBtn" and not(@disabled)]
, note lenot(@disabled)
partie.Voici ce que nous avons fini avec. (Merci à lukeis et RossPatterson.) Notez que nous avons eu à trouver tous les éléments d'identification, puis filtrer par "désactivé". J'aurais préféré un seul motif de recherche, mais que pouvez-vous faire?
Il y a déjà quelques grandes réponses postées ici, mais j'ai pensé que je voudrais ajouter ma solution. Explicite d'attente etc. sont grandes fonctions à utiliser dans les tests avec selenium. Cependant explicite attendre seulement remplit la fonction d'un
Thread.Sleep()
que vous ne pouvez avoir qu'un temps. La fonction ci-dessous est ce que j'ai utilisé pour "Raser" quelques minutes. Il attend jusqu'à ce que l'élément est "accessible".Il est en C#, mais pour s'adapter, il ne serait pas difficile. Espérons que cette aide.
Je pense que quelque chose le long de ces lignes devrait fonctionner aussi bien: