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?
Oui, c'est possible avec la méthode invisibilityOfElementLocated
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
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
.
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.
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, 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))
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);
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;
}