Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Дождаться исчезновения элемента (C#)


(Вованза) #1

Ребята, помогите.
Нужно дождаться исчезновения элемента.
Знаю на Java есть для этого метод - invisibilityOfElementLocated.
Есть ли что нибудь подобное на c#? И как по красивому решить эту задачу?


(5am) #2

как вариант:

если элемент пропадает не сразу, а с задержкой -

опционально - чекать окончание Ajax’а
каждый N сек искать элемент и если WebElement.Displayed то он еще присуствует, как только он не Displayed => пропал.


(Вованза) #3

Да, элемент пропадает не сразу.
В общем не знаю насколько это красиво, но вот, мб кому пригодится.

           try
        {
            while (Driver.FindElementById("element").Displayed)
            {
                if (tm >= 10)
                {
                    Assert.Fail("Error step 3");
                    break;
                }
                else
                {
                    Thread.Sleep(1000);
                    tm++;
                }
            }
        }
        catch (NoSuchElementException)
        {
            
        }

(vmaximv) #4

Не красиво. Посмотрите как это реализовано в “коробочных” кондишенах и по аналогии напишите свои:


(Werewolfas) #5
 /// <summary>
    /// An expectation for checking that an element is either invisible or not
    /// present on the DOM.
    /// </summary>
    /// <param name="locator">The locator used to find the element.</param>
    /// <returns><see langword="true"/> when the element is invisible or not present; otherwise, <see langword="false"/>.</returns>
    public static Func<IWebDriver, bool> InvisibilityOfElementLocated(By locator)
    {
        return (driver) =>
            {
                try
                {
                    return !driver.FindElement(locator).Displayed;
                }
                catch (NoSuchElementException e)
                {
                    // Returns true because the element is not present in DOM. The
                    // try block checks if the element is present but is invisible.
                    return true;
                }
                catch (StaleElementReferenceException e)
                {
                    // Returns true because stale element reference implies that element
                    // is no longer visible.
                    return true;
                }
            };
    } 

Порт “коробочного” кондишена с Java в C#

Так как я в Java заметил достаточно большое количество таких методов, то портировал их для своего проекта.


(Вованза) #6

Блин, сам не додумался в реализацию InvisibilityOfElementLocated на java заглянуть)))
Видимо заработался)
всем спасибо!


(asolntsev) #7

Самое красивое решение этой задачи предлагает Selenide.
Буквально одна строчка:

$("#mydiv").should(disappear);

(Werewolfas) #8

Все это прекрастно, но вопрос был о C#, а Selenide, на сколько я знаю, Java.

Так же был указан метод ExpectedConditions и тот же Selenide cкорей всего так же использует этот метод, а как вы реализуете в своем коде это уже дело каждого, у некоторых могут быть хелперы аналогичные указанному вами коду.