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?
8 réponses
Oui, c'est possible avec la méthode invisibilityOfElementLocated
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
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
.
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.
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);
}
}
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))
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);
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;
}
dans le code ci-dessous qui est utilisé pour arrêter le pilote pendant quelques secondes
Système.Le filetage.Fil.Sommeil(20000);