Sélénium-attendre jusqu'à ce que l'élément ne soit pas visible

Dans le code ci-dessous, j'ai essayer d'attendre jusqu'à ce qu'un élément est visible:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("processing")));

est-il possible de dire au pilote d'attendre que cet élément ne soit pas visible?

23
demandé sur Jeremy Cook 2014-03-26 00:54:54

8 réponses

Oui, c'est possible avec la méthode invisibilityOfElementLocated

wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
26
répondu TDHM 2014-03-26 05:45:39

ce qui suit devrait attendre jusqu'à ce que l'élément ne soit plus affiché, c'est-à-dire qu'il ne soit pas visible (ou qu'il ne soit plus visible après 10 Secondes)

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(driver => !driver.FindElement(By.Id("processing")).Displayed);

Il va lever une exception si un élément ne peut pas être trouvé avec l'id processing.

10
répondu Russ Cam 2014-03-25 21:01:46
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));

L'idée est d'attendre jusqu'à ce que l'élément n'est pas visible. La première ligne fixe le temps d'attente que l'élément doit disparaître; ici c'est 10 Secondes. La deuxième ligne utilise le sélénium pour vérifier si la condition "invisibilityofElementLocated" est respectée. L'élément est trouvé par son id comme dans le sujet, c'est-à id="processing". Si element ne disparaît pas dans la période de temps demandée, une exception de Timeout sera soulevée et le test échouera.

4
répondu Me Like Cookies 2015-07-07 19:09:38

Utilisez la méthode d'invisibilité, et voici un exemple d'utilisation.

final public static boolean waitForElToBeRemove(WebDriver driver, final By by) {
    try {
        driver.manage().timeouts()
                .implicitlyWait(0, TimeUnit.SECONDS);

        WebDriverWait wait = new WebDriverWait(UITestBase.driver,
                DEFAULT_TIMEOUT);

        boolean present = wait
                .ignoring(StaleElementReferenceException.class)
                .ignoring(NoSuchElementException.class)
                .until(ExpectedConditions.invisibilityOfElementLocated(by));

        return present;
    } catch (Exception e) {
        return false;
    } finally {
        driver.manage().timeouts()
                .implicitlyWait(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
    }
}
1
répondu 1-14x0r 2015-06-02 21:50:39

Oui, vous pouvez créer votre propre ExpectedCondition, juste revenir visible non visible.

Voici comment le faire en python:

from selenium.webdriver.support.expected_conditions import _element_if_visible

class invisibility_of(object):

    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        return not _element_if_visible(self.element)

et comment l'utiliser:

wait = WebDriverWait(browser, 10)
wait.until(invisibility_of(elem))
1
répondu Sergey 2016-05-06 09:52:34

je sais que c'est vieux, mais comme je cherchais une solution à ça, j'ai pensé ajouter mes pensées.

la réponse donnée ci-dessus devrait fonctionner si vous définissez la propriété IgnoreExceptionTypes:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.IgnoreExceptionTypes = new[] { typeof(NoSuchElementException) }
wait Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
0
répondu bornfromanegg 2015-03-05 08:32:23
public void WaitForElementNotVisible(string id, int seconds)
    {

        try
        {
            var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(seconds));                   
            wait.Until(driver1 => !visibility(id));
            Console.WriteLine("Element is not visible..");
        }
        catch (WebDriverTimeoutException)
        {
            Assert.Fail("Element is still visible..");
        }


    }


    bool visibility(string id)
    {
        bool flag;
        try
        {
            flag = driver.FindElement(By.Id(locator)).Displayed;
        }
        catch (NoSuchElementException)
        {
            flag = false;
        }
        return flag;
    }
0
répondu Anoop 2015-06-03 09:32:43

dans le code ci-dessous qui est utilisé pour arrêter le pilote pendant quelques secondes

Système.Le filetage.Fil.Sommeil(20000);

-14
répondu user3916823 2014-08-07 04:49:39