Подтвердить что ты не робот

Селен - Подождите, пока элемент не будет виден

В приведенном ниже коде я пытаюсь подождать, пока элемент не будет виден:

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

Можно ли сообщить драйверу ждать, пока этот элемент НЕ будет виден?

4b9b3361

Ответ 1

Да, это возможно с помощью метода invisibilityOfElementLocated

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

Ответ 2

Следующее должно подождать, пока элемент больше не будет отображаться, т.е. не видно (или тайм-аут через 10 секунд)

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

Он выдает исключение, если элемент не может быть найден с id processing.

Ответ 3

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

Идея состоит в том, чтобы ждать, пока элемент не будет виден. Первая строка устанавливает время ожидания, которое элемент должен исчезнуть; вот он 10 секунд. Вторая строка использует селен, чтобы проверить, выполнено ли условие "invisibilityofElementLocated". Элемент найден по его id, как в случае с тобой, то есть id="processing". Если элемент не исчезнет в течение запрошенного периода времени, исключение тайм-аута будет поднято, и тест завершится с ошибкой.

Ответ 4

Используйте метод невидимости, и вот пример использования.

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);
    }
}

Ответ 5

Я знаю, что это старо, но, поскольку я искал решение этого, я думал, что добавлю свои мысли.

Ответ, приведенный выше, должен работать, если вы задаете свойство IgnoreExceptionTypes:

var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.IgnoreExceptionTypes = new[] { typeof(NoSuchElementException) }
wait Until(driver => !driver.FindElement(By.Id("processing")).Displayed);

Ответ 6

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;
    }

Ответ 7

Да, вы можете создать свое собственное 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))

Ответ 8

Вы можете использовать driver.FindElements для доступа к несуществующим элементам.

wait.Until(d => d.FindElements(By.Id("processing")).Count == 0);

Ответ 9

В приведенном ниже коде, который используется для остановки драйвера в течение нескольких секунд

System.Threading.Thread.Sleep(20000);