Comme l'indique le commentaire, il s'agit de C# et non de Java, mais l'idée est la même. J'ai fait des recherches approfondies sur ce problème et, en fin de compte, FindElement renvoie toujours une exception lorsque l'élément n'existe pas. Il n'y a pas d'option surchargée qui vous permette d'obtenir null ou autre chose. Voici pourquoi je préfère cette solution aux autres.
- Renvoyer une liste d'éléments puis vérifier si la taille de la liste est égale à 0 fonctionne mais vous perdez ainsi en fonctionnalité. Vous ne pouvez pas faire un .click() sur une collection de liens même si la taille de la collection est de 1.
- Vous pourriez affirmer que l'élément existe, mais souvent cela arrête vos tests. Dans certains cas, j'ai un lien supplémentaire à cliquer selon la façon dont je suis arrivé sur cette page et je veux cliquer dessus s'il existe ou passer à autre chose.
- C'est seulement lent si vous ne définissez pas le délai d'attente. driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)) ;
-
C'est en fait une méthode très simple et élégante une fois qu'elle est créée. En utilisant FindElementSafe au lieu de FindElement je ne "vois" pas l'affreux bloc try/catch et je peux utiliser un simple Existe méthode. Cela ressemblerait à quelque chose comme ceci :
IWebElement myLink = driver.FindElementSafe(By.Id("myId"));
if (myLink.Exists)
{
myLink.Click();
}
Voici comment étendre IWebElement et IWebDriver.
IWebDriver.FindElementSafe
/// <summary>
/// Same as FindElement only returns null when not found instead of an exception.
/// </summary>
/// <param name="driver">current browser instance</param>
/// <param name="by">The search string for finding element</param>
/// <returns>Returns element or null if not found</returns>
public static IWebElement FindElementSafe(this IWebDriver driver, By by)
{
try
{
return driver.FindElement(by);
}
catch (NoSuchElementException)
{
return null;
}
}
IWebElement.Existe
/// <summary>
/// Requires finding element by FindElementSafe(By).
/// Returns T/F depending on if element is defined or null.
/// </summary>
/// <param name="element">Current element</param>
/// <returns>Returns T/F depending on if element is defined or null.</returns>
public static bool Exists(this IWebElement element)
{
if (element == null)
{ return false; }
return true;
}
Vous pourriez utiliser le polymorphisme pour modifier l'instance de la classe IWebDriver de FindElement, mais c'est une mauvaise idée du point de vue de la maintenance.
2 votes
@Michael Freidgeim : avant d'accuser quelqu'un d'avoir écrit une question dublicate, vérifiez la date de création de la question pour déterminer laquelle est dublicate.
0 votes
Je ne vous en veux pas. C'est juste une façon de faire le ménage - pour relier les questions similaires entre elles. Voir Dois-je voter pour fermer une question dupliquée, même si elle est beaucoup plus récente et contient des réponses plus à jour ? "Si la nouvelle question est une meilleure question ou a de meilleures réponses, alors votez pour fermer l'ancienne question comme un doublon de la nouvelle."