web-dev-qa-db-fra.com

C # Selenium 'ExpectedConditions est obsolète'

Lorsque j'essaie d'attendre explicitement qu'un élément devienne visible à l'aide d'ExpectedConditions, Visual Studio me prévient qu'il est maintenant obsolète et qu'il sera bientôt supprimé de Selenium. 

Quelle est la méthode actuelle/nouvelle pour obtenir le même résultat?

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));
24
David Stampher

J'ai résolu ma propre question et je voulais fournir la réponse à quiconque se demandait comment résoudre ce problème avec la dernière version de Selenium.

À l’aide de nuget, recherchez DotNetSeleniumExtras.WaitHelpers, importez cet espace de noms dans votre classe. Maintenant vous pouvez faire ceci:

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("content-section")));

Et l'avertissement dans le IDE aura disparu.

47
David Stampher

C'est très simple, il suffit de changer

Wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));

à

Wait.Until(c => c.FindElement(By.Id("content-section")));
9
Everton Rocha

Si vous ne souhaitez pas télécharger un package de nuget supplémentaire, il est assez facile de déclarer votre propre fonction (ou condition), en particulier à l'aide d'une expression lamda, par exemple.

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(condition =>
{
    try
    {
        var elementToBeDisplayed = driver.FindElement(By.Id("content-section"));
        return elementToBeDisplayed.Displayed;
    }
    catch (StaleElementReferenceException)
    {
        return false;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
});

Ceci est également très polyvalent, car il est maintenant possible d’évaluer tout type d’expression bool.

7
Rob F.

La réponse pour passer à la fonction anonyme est la plus correcte. Ou écrivez votre propre classe, vos conditions d’attente nécessaires. Voici un exemple d'utilisation d'une fonction anonyme pour le scénario explicite ci-dessus:.

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
wait.IgnoreExceptions(typeof(NoSuchElementException), typeof(ElementNotVisibleException));
var element = wait.Until(() => 
{
    var e = Driver.FindElement(By.Id("content-section"));
    if(e.Displayed)
        return e;
});

Et à ce stade, la fonction elle-même peut être désactivée dans une classe de votre solution que vous pouvez appeler. La bonne chose avec cela est que vous pouvez modifier au besoin; J'ai vu plusieurs cas où des sites Web vraiment médiocres finissaient par casser le fonctionnement d'ExpectedConditions, ce qui a été résolu avec l'équipe qui écrivait notre propre fonction.

Selon le contributeur C #:

En ce qui concerne ExpectedConditions, là encore, il s’agissait d’un ajout créé dans .NET uniquement parce que "Java l’a". Au moment de la création de la classe ExpectedConditions dans Java, la syntaxe permettant de créer une fonction lambda (ou quelque chose qui agissait de la sorte) était particulièrement obscure et difficile à comprendre. Dans ce cas, une classe d'assistance était très utile pour les liaisons Java. Cependant, C # n'est pas Java. En C #, la syntaxe de création de fonctions lambda ("méthodes anonymes" dans le langage de la documentation de Microsoft) est bien comprise par les développeurs C # depuis de nombreuses années et constitue un outil standard dans leur arsenal.

Dans ce cas, la question de la verbosité du code a du mérite, mais étant donné que les conditions d’attente sont rarement identiques, il serait beaucoup plus simple pour les utilisateurs de développer leur propre classe de conditions qui contient re intéressé par. Ceci, cependant, est quelque chose que les utilisateurs ont une aversion pour. De plus, l'idée d'une collection "standard" d'implémentations de conditions d'attente spécifiques semble être une bonne idée, mais il existe de nombreuses variations sur la manière dont les utilisateurs souhaitent que chaque condition fonctionne. Avoir un ensemble de conditions d'attente pourrait être une bonne chose, mais le projet Selenium n'est pas l'endroit idéal pour cela.

http://jimevansmusic.blogspot.com/2018/03/deprecating-parts-of-seleniums-net.html

2
PandaMagnus

Nuget requis - DotNetSeleniumExtras.WaitHelpers

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("")));

Je viens de démontrer l'événement cliquable de l'élément. De même, d'autres événements peuvent être utilisés avec les paramètres requis. J'espère que ça aide

1
Krunal Patel

vérifiez quelle version de Selenium.Support et de Selenium.WebDriver NuGet Package avez-vous installée? J'ai maintenant le même problème avec la dernière version 3.11.2 et j'ai rétrogradé à 3.10.0 et cela a résolu le problème.

0
martin pb