Le sélénium c# Webdriver: Attendre Jusqu'à ce que l'Élément est Présent
Je veux faire en sorte qu'un élément est présent avant le webdriver commence à faire des trucs.
Je vais essayer d'obtenir quelque chose comme cela fonctionne:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Je suis surtout mal comment configurer le anynomous fonction..
Vous devez vous connecter pour publier un commentaire.
Alternativement, vous pouvez utiliser implicite attendre:
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
À l'aide de la solution fournie par Mike Kwan peut avoir un impact dans l'ensemble des tests de performance, puisque l'implicite d'attente sera utilisé dans tous les FindElement appels.
Plusieurs fois, vous aurez besoin de la FindElement à l'échec tout de suite quand un élément n'est pas présent (vous êtes à l'essai pour la malformation de la page, les éléments manquants, etc.). Avec l'implicite attendre ces opérations attendre la fin de la temporisation expire avant de lancer l'exception. La valeur par défaut implicite d'attente est fixé à 0 secondes.
J'ai écrit un peu de la méthode d'extension à à IWebDriver qui ajoute un délai d'attente (en secondes) paramètre à la FindElement() la méthode. Il est tout à fait explicite:
Je n'ai pas de cache de la WebDriverWait objet que sa création est très bon marché, cette extension peut être utilisée simultanément pour différentes WebDriver objets, et je n'optimisations quand en fin de compte nécessaire.
L'utilisation est très simple:
WebDriverWait
sont de laOpenQA.Selenium.Support.UI
espace de noms et vient dans un paquet séparé appeléSelenium WebDriver Support Classes
sur NuGettry..catch
pourNoSuchElementException
dans leFindElement
méthode d'extension et de retournull
lorsque cette exception est générée. Ensuite, vous aurez à vérifier la valeur null à chaque fois que vous essayez de trouver un élément avec cette méthode. Parfois, il est plus facile de gérer les exceptions que de créer de la valeur null vérifie partout... Cela dépend de la façon dont vous écrivez votre code.Selenium WebDriver Support Classes
est maintenant apparu sur NuGet "en Sélénium.Support", la version actuelle est la 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
et il fonctionne très bien maintenant. Heads up au cas où quelqu'un d'autre obtient des éléments aléatoires ont pas trouvé encore.Vous pouvez également utiliser
ExpectedConditions.ElementExists
De sorte que vous sera la recherche d'un élément de disponibilité comme ça
Source
Voici une variante de @Loudenvier la solution qui fonctionne aussi pour obtenir de multiples éléments:
Inspiré par Loudenvier de la solution, voici une méthode d'extension qui fonctionne pour tous les ISearchContext objets, pas seulement IWebDriver, qui est une spécialisation de l'ancien. Cette méthode prend également en charge d'attente jusqu'à ce que l'élément est affiché.
Exemple d'utilisation:
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
qui va encore l'emporter sur le délai d'attente valeur que vous définissez ici.J'ai Confondu anyomous de la fonction avec le prédicat. Heres un peu de méthode d'assistance:
Vous pouvez trouver quelque chose comme ça en C# .
C'est ce que j'ai utilisé dans JUnit - Sélénium
Faire importer des paquets liés
La clickAndWait commande ne fonctionne pas converties lorsque vous choisissez le Webdriver format dans le Selenium IDE. Voici la solution de contournement. Ajouter l'attente de la ligne ci-dessous. De façon réaliste, le problème a été le déclic ou d'un événement qui s'est passé avant que celui-ligne 1 dans mon code C#. Mais vraiment, assurez-vous d'avoir un WaitForElement avant toute action où vous faites référence à un "Par" objet.
Code HTML:
C#/NUnit code:
Python:
de CE que vous pouvez choisir d'autres conditions ainsi
essayez ceci: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
Essayez ce code:
Explicite Attendre
Exemple:
Vous ne voulez pas attendre trop longtemps avant de l'élément change. Dans ce code, le webdriver attend jusqu'à 2 secondes avant de continuer.
Depuis que je suis séparer les éléments de la page de définitions et de la page de test à l'aide de scénarios déjà trouvé IWebElement pour la visibilité pourrait être fait comme ceci:
Je vois plusieurs solutions déjà posté ce grand travail! Cependant, juste au cas où quelqu'un a besoin de quelque chose d'autre, j'ai pensé que je poste les deux solutions que j'ai personnellement utilisé en sélénium C# pour tester si un élément est présent! Espérons que cela aide, cheers!
Voici le deuxième
Utilisé Rn222 et Aknuds1 d'utiliser un ISearchContext qui renvoie à un élément ou une liste. Et un nombre minimum d'éléments peuvent être spécifiés:
Exemple d'utilisation:
This is the reusable function to wait for an element present in DOM using Explicit Wait.
Public void WaitForElement(IWebElement element, int timeout = 2){
WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromMinutes(timeout));
wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException));
wait.Until<bool> (driver =>
{
try
{
return element.Displayed;
}
catch(Exception)
{
return false;
}
});
}
Nous pouvons réaliser que comme ceci:
WebDriverWait
ne prendra pas effet.Ce serait immédiatement lancer 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'existe pas.
Peut-être
SeleniumExtras.WaitHelpers
fonctionne, mais je n'ai pas essayé. C'est officiel, mais a été divisée dans un autre package nuget. Vous pouvez vous référer à C# Sélénium 'ExpectedConditions est obsolète".Moi-même est à l'aide de
FindElements
et de vérifier siCount == 0
, si la valeur est true, l'utilisationawait Task.Delay
. C'est vraiment pas assez efficace.Était à la recherche d'attendre en Sélénium de l'état, a atterri dans ce fil, et voici ce que j'utilise maintenant:
ReadCell(row, col) != ""
peut être n'importe quelle condition. Comme de cette façon parce que:Première réponse est la bonne, mon problème était que les exceptions non gérées ne pas fermer web pilote correctement et elle a toujours la même valeur, j'avais utilisé ce qui était de 1 seconde.
Si vous obtenez le même problème
restart you visual studio
et de s'assurer queall the exceptions are handled
correctement.