Ответ 1
Да, это возможно с помощью метода invisibilityOfElementLocated
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
В приведенном ниже коде я пытаюсь подождать, пока элемент не будет виден:
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("processing")));
Можно ли сообщить драйверу ждать, пока этот элемент НЕ будет виден?
Да, это возможно с помощью метода invisibilityOfElementLocated
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
Следующее должно подождать, пока элемент больше не будет отображаться, т.е. не видно (или тайм-аут через 10 секунд)
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
Он выдает исключение, если элемент не может быть найден с id processing
.
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));
Идея состоит в том, чтобы ждать, пока элемент не будет виден. Первая строка устанавливает время ожидания, которое элемент должен исчезнуть; вот он 10 секунд. Вторая строка использует селен, чтобы проверить, выполнено ли условие "invisibilityofElementLocated". Элемент найден по его id, как в случае с тобой, то есть id="processing"
. Если элемент не исчезнет в течение запрошенного периода времени, исключение тайм-аута будет поднято, и тест завершится с ошибкой.
Используйте метод невидимости, и вот пример использования.
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);
}
}
Я знаю, что это старо, но, поскольку я искал решение этого, я думал, что добавлю свои мысли.
Ответ, приведенный выше, должен работать, если вы задаете свойство 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;
}
Да, вы можете создать свое собственное ExpectedCondition, просто верните видимое значение не видно.
Вот как это сделать в 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)
и как его использовать:
wait = WebDriverWait(browser, 10)
wait.until(invisibility_of(elem))
Вы можете использовать driver.FindElements
для доступа к несуществующим элементам.
wait.Until(d => d.FindElements(By.Id("processing")).Count == 0);
В приведенном ниже коде, который используется для остановки драйвера в течение нескольких секунд
System.Threading.Thread.Sleep(20000);