web-dev-qa-db-fra.com

Sélénium - Attendez que l'élément ne soit PAS visible

Dans le code ci-dessous, j'essaie d'attendre qu'un élément soit visible:

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

Est-il possible de dire au conducteur d'attendre que cet élément ne soit PAS visible?

24
user2917239

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

wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
29
TDHM

Les éléments suivants doivent attendre que l’élément ne soit plus affiché, c’est-à-dire qu’il n’est pas visible (ou expire après 10 secondes)

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

Il lève une exception si un élément est introuvable avec l'ID processing

10
Russ Cam
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));

L'idée est d'attendre que l'élément ne soit plus visible. La première ligne définit le temps d'attente pendant lequel cet élément doit disparaître; ici c'est 10 secondes. La deuxième ligne utilise Selenium pour vérifier si la condition "invisibilityofElementLocated" est remplie. L'élément est trouvé par son identifiant comme dans le cas, c'est-à-dire id="processing". Si l'élément ne disparaît pas dans la période demandée, une exception de délai d'attente est déclenchée et le test échoue.

5
Me Like Cookies

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
1-14x0r

Oui, vous pouvez créer votre propre ExpectedCondition, il suffit de 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))
0
Sergey

Je sais que c'est vieux, mais depuis que je cherchais une solution à ce problème, 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
bornfromanegg
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
Anoop