2017-06-19 1 views
0

Je dois attendre qu'un élément NE SOIT PAS visible et j'ai trouvé quelques solutions pour cela, mais aucune d'entre elles ne semble fonctionner pour moi.Comment attendre jusqu'à ce qu'un élément soit invisible

Je pense que le problème vient du fait que j'utilise des modèles PageObject. mais je ne suis pas complètement sûr.

public static void WaitForElementToBeInvisible(this Browser browser, IWebElement element, int seconds = 30) 
     { 
      var wait = new WebDriverWait(browser.Driver, new TimeSpan(0, 0, seconds)); 
      wait.Until(ExpectedConditions.InvisibilityOfElementLocated(element)); 
     } 

Mais il renvoie l'erreur cannot convert from IWebElement to Selenium.By

Merci à l'avance

+0

fonction Pouvez-vous ajouter d'appeler le code aussi bien? – Murthi

+0

De cette exception, vous passez Iwebelement au lieu de Locator. – Murthi

+1

Bonjour Dymond, J'ai fait des tonnes de recherches sur ce sujet et j'ai codé avec le sélénium C# depuis plus de 6 mois et à ma connaissance ce n'est pas possible. Certaines choses concernant le motif de conception d'objet Page n'ont pas de sens et vous devriez essayer de le faire avec un objet 'By'. –

Répondre

0

Merci pour toute la réponse, mais l'a résolu comme ceci.

public static void WaitUntilInvisible(this Browser browser, By element, int seconds = 30) 
     { 
      var wait = new WebDriverWait(browser.Driver, new TimeSpan(0, 0, seconds)); 
      wait.Until(ExpectedConditions.InvisibilityOfElementLocated(element)); 
     } 

ensuite utilisé comme par localisateur

By LoadingIcon = By.XPath(".//*[contains(@class, 'loading')]"); 

fonctionne comme un charme :)

1

réponse courte, ce n'est pas possible. Les développeurs de Selenium ont décidé qu'il n'y avait aucun cas d'utilisation utile pour cela.

Si localisateur By est possible, vous pouvez utiliser:

public static void WaitUntilInvisible(this By locator) 
     { 
      try 
      { 
       if (Driver.FindElement(locator).Displayed) 
       { 
        wait.Until(ExpectedConditions.ElementIsVisible(locator)); 
       } 
     } 

Voir aussi: Trying to convert IWebElement into a By element

1

Votre code est incorrect. Il appelle InvisibilityOfElementLocated qui ne reçoit pas IWebElement en tant que paramètre. Voir mon exemple ci-dessous.

public static bool WaitForElementToBeInvisible(this IWebElement element, int timeoutSecond = 10) 
{ 
    IWait<IWebElement> wait = new DefaultWait<IWebElement>(element); 
    wait.Timeout = TimeSpan.FromSeconds(timeoutSecond); 
    wait.PollingInterval = TimeSpan.FromMilliseconds(300); 
    try 
    { 
     wait.Until(!element.Displayed); 
    } 
    catch (WebDriverTimeoutException) 
    { 
     return false; 
    } 

    return true; 
} 

IWebElement div = driver.FindElement(By.Id("id")); 
var result = div.WaitForElementToBeInvisible(5); 
0
do { Playback.Wait(100); } while (_driver.FindElements(By.Id("elementId")).Count() > 0);