Je veux m'assurer qu'un élément est présent avant que le webdriver ne commence à faire des choses.
J'essaie de faire fonctionner quelque chose comme ça:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
J'ai principalement du mal à configurer la fonction anynomous.
TimeSpan.FromSeconds(5)
. Cela rend les choses plus claires IMORéponses:
Vous pouvez également utiliser l'attente implicite:
la source
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
L'utilisation de la solution fournie par Mike Kwan peut avoir un impact sur les performances globales des tests, car l'attente implicite sera utilisée dans tous les appels FindElement. Plusieurs fois, vous voudrez que FindElement échoue immédiatement lorsqu'un élément n'est pas présent (vous testez une page mal formée, des éléments manquants, etc.). Avec l'attente implicite, ces opérations attendraient l'expiration de tout le délai avant de lever l'exception. L'attente implicite par défaut est définie sur 0 seconde.
J'ai écrit une petite méthode d'extension à IWebDriver qui ajoute un paramètre de délai (en secondes) à la
FindElement()
méthode. C'est assez explicite:Je n'ai pas mis en cache l'objet WebDriverWait car sa création est très bon marché, cette extension peut être utilisée simultanément pour différents objets WebDriver, et je n'effectue des optimisations qu'en cas de besoin.
L'utilisation est simple:
la source
WebDriverWait
sont de l'OpenQA.Selenium.Support.UI
espace de noms et sontSelenium WebDriver Support Classes
livrés dans un package séparé appelé NuGetSelenium WebDriver Support Classes
est maintenant apparu sur NuGet sous le nom "Selenium.Support" , la version actuelle est 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
et cela fonctionne très bien maintenant. Attention au cas où quelqu'un d'autre obtiendrait des éléments aléatoires encore introuvables.Vous pouvez aussi utiliser
ExpectedConditions.ElementExists
Vous allez donc rechercher une disponibilité d'élément comme celle-là
La source
la source
DotNetSeleniumExtras.WaitHelpers
(mentionné par @Dejan ci-dessus) "n'est pas maintenu, les problèmes ne seront pas résolus, les PR ne seront pas acceptés". (source: github.com/SeleniumHQ/selenium/issues/… ). Son éditeur est à la recherche d'un responsable pour le reprendre.Voici une variante de la solution de @ Loudenvier qui fonctionne également pour obtenir plusieurs éléments:
la source
Inspirée de la solution de Loudenvier, voici une méthode d'extension qui fonctionne pour tous les objets ISearchContext, pas seulement IWebDriver, qui est une spécialisation du premier. Cette méthode prend également en charge l'attente jusqu'à ce que l'élément s'affiche.
Exemple d'utilisation:
la source
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
celle-ci, elle l'emportera toujours sur la valeur de délai d'expiration que vous avez définie ici.Stopwatch
autour de l'appel à la méthode d'extension et unConsole.WriteLine()
à l'intérieur du lambda envoyé àUntil()
. Le chronomètre mesurait presque exactement 60 secondes et un seul message était écritConsole
. Est-ce que j'ai râté quelque chose?J'ai confondu la fonction anyomous avec le prédicat. Voici une petite méthode d'aide:
la source
Vous pouvez trouver quelque chose comme ça en C #.
C'est ce que j'ai utilisé dans JUnit - Selenium
Importez des packages associés
la source
la source
la source
La commande clickAndWait n'est pas convertie lorsque vous choisissez le format Webdriver dans Selenium IDE. Voici la solution de contournement. Ajoutez la ligne d'attente ci-dessous. En réalité, le problème était le clic ou l'événement qui s'est produit avant celui-ci - ligne 1 dans mon code C #. Mais vraiment, assurez-vous simplement d'avoir un WaitForElement avant toute action où vous faites référence à un objet "By".
Code HTML:
Code C # / NUnit:
la source
Python:
depuis EC, vous pouvez également choisir d'autres conditions, essayez ceci: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
la source
Essayez ce code:
la source
Attente explicite
Exemple:
la source
Utilisé Rn222 et Aknuds1 pour utiliser un ISearchContext qui renvoie soit un seul élément, soit une liste. Et un nombre minimum d'éléments peut être spécifié:
Exemple d'utilisation:
la source
Vous ne voulez pas attendre trop longtemps avant que l'élément change. Dans ce code, le pilote Web attend jusqu'à 2 secondes avant de continuer.
la source
Étant donné que je sépare les définitions d'éléments de page et les scénarios de test de page en utilisant IWebElement déjà trouvé pour la visibilité, vous pouvez procéder comme suit:
la source
Il s'agit de la fonction réutilisable pour attendre un élément présent dans le DOM à l'aide de l'attente explicite.
la source
Nous pouvons y parvenir comme ceci:
la source
WebDriverWait
ne prendra pas effet.Cela lèverait immédiatement une exception une fois que la page est "interactive". Je ne sais pas pourquoi mais le délai d'attente agit comme s'il n'existait pas.
Fonctionne
SeleniumExtras.WaitHelpers
peut- être mais je n'ai pas essayé. C'est officiel mais a été divisé en un autre paquet de pépites. Vous pouvez vous référer à C # Selenium 'ExpectedConditions is obsolete' .Moi- même, j'utilise
FindElements
et vérifie siCount == 0
, si c'est vrai, j'utiliseawait Task.Delay
. Ce n'est vraiment pas tout à fait efficace.la source
Vous pouvez utiliser ce qui suit
la source
Je vois plusieurs solutions déjà publiées qui fonctionnent très bien! Cependant, juste au cas où quelqu'un aurait besoin d'autre chose, j'ai pensé publier deux solutions que j'ai personnellement utilisées dans le sélénium C # pour tester si un élément est présent! J'espère que ça aide, bravo!
Voici le second
la source
la source
La première réponse est bonne, mon problème était que les exceptions non gérées ne fermaient pas correctement le pilote Web et conservaient la même première valeur que j'avais utilisée, à savoir 1 seconde.
Si vous rencontrez le même problème
restart you visual studio
et assurez-vous queall the exceptions are handled
correctement.la source
Cherchait comment attendre dans Selenium pour l'état, a atterri dans ce fil et voici ce que j'utilise maintenant:
ReadCell(row, col) != ""
peut être n'importe quelle condition. Comme ça parce que:la source