web-dev-qa-db-fra.com

Comment ajouter des conditions attendues personnalisées pour Selenium?

J'essaie d'écrire mes propres ExpectedConditions pour Selenium mais je ne sais pas comment en ajouter un nouveau. Quelqu'un a-t-il un exemple? Je ne trouve pas de tutoriels pour cela en ligne.

Dans mon cas actuel, je veux attendre qu'un élément existe, soit visible, est activé ET n'a pas l'attr "aria-disabled". Je sais que ce code ne fonctionne pas:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(seconds));
return wait.Until<IWebElement>((d) =>
    {
        return ExpectedConditions.ElementExists(locator) 
        && ExpectedConditions.ElementIsVisible 
        &&  d.FindElement(locator).Enabled 
         && !d.FindElement(locator).GetAttribute("aria-disabled")
    }

EDIT: Une petite info supplémentaire: le problème que je rencontre est avec les onglets jQuery. J'ai un formulaire sur un onglet désactivé et il va commencer à remplir les champs sur cet onglet avant que l'onglet ne devienne actif.

14
Rochelle C

Une "condition attendue" n'est rien d'autre qu'une méthode anonyme utilisant une expression lambda. Celles-ci sont devenues un élément essentiel du développement .NET depuis .NET 3.0, en particulier avec la publication de LINQ. Étant donné que la grande majorité des développeurs .NET maîtrisent la syntaxe lambda C #, l'implémentation ExpectedConditions des liaisons WebDriver .NET ne comporte que quelques méthodes. 

Créer une attente comme celle que vous demandez ressemblerait à quelque chose comme ceci:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until<IWebElement>((d) =>
{
    IWebElement element = d.FindElement(By.Id("myid"));
    if (element.Displayed &&
        element.Enabled &&
        element.GetAttribute("aria-disabled") == null)
    {
        return element;
    }

    return null;
});

Si vous n'êtes pas expérimenté avec cette construction, je vous conseillerais de le devenir. Il est seulement probable que cela deviendra plus répandu dans les futures versions de .NET.

32
JimEvans

Je comprends la théorie sous-jacente à ExpectedConditions (je pense), mais je trouve souvent qu’elles sont lourdes et difficiles à utiliser en pratique.

J'irais avec ce genre d'approche:

public void WaitForElementPresentAndEnabled(By locator, int secondsToWait = 30)
{
   new WebDriverWait(driver, new TimeSpan(0, 0, secondsToWait))
      .Until(d => d.FindElement(locator).Enabled
          && d.FindElement(locator).Displayed
          && d.FindElement(locator).GetAttribute("aria-disabled") == null
      );
}

Je serai heureux d'apprendre d'une réponse qui utilise tout ExpectedConditions ici :)

2

J'ai converti un exemple de WebDriverWait et ExpectedCondition/s de Java en C #.

Version Java:

WebElement table = (new WebDriverWait(driver, 20))  
.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("table#tabletable")));

Version C #:

IWebElement table = new WebDriverWait(driver, TimeSpan.FromMilliseconds(20000))
.Until(ExpectedConditions.ElementExists(By.CssSelector("table#tabletable")));
0
Alex Z