Selenium: ожидание завершения процесса индикатора выполнения в пользовательском интерфейсе (подождите, пока индикатор выполнения может изменить тест на другой тест)

Я использую селен для автоматизации пользовательского интерфейса, где я хочу дождаться завершения индикатора выполнения, и после завершения индикатора выполнения я хочу выполнить какое-то другое действие. Я пробовал WedDriverWait, обнаружение невидимости элемента, но он не работает. Пожалуйста, предложите какой-нибудь способ обработки индикатора выполнения с помощью C # Selenium.

Я пробовал waitUntil Невидимость функции, расположенной в элементе, для конкретного Xpath

 WebDriverWait wait = new WebDriverWait(driver, System.TimeSpan.FromSeconds(900000000));
                                wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath(buildProgressStringExp)));

string buildProgressStringExp = "//table[@class='pane stripped']/tbody//descendant::tr[@class='build-row transitive single-line overflow-checked']//table[@class='progress-bar ']"

Индикатор выполнения и HTML DOM

Я пробовал приведенный ниже код, но он все еще не работал. Его ожидание до определенного срока после этого исключения

        {while(true)
                {
                    try
                    {
                        IWebElement el = driver.FindElement(By.XPath("Xpath of bar"));
                        bool abc = el.GetAttribute("style").Equals("width:100%;");
                        if (abc)
                        {
                            return true;
                        }
                    }
                        catch(StaleElementReferenceException exp)
                    {
                            return true;
                        }
                    Thread.Sleep(1000);
                    }
                }```

person Zoso619    schedule 10.09.2019    source источник
comment
В конце сборки некоторые состояния на экране изменятся, например, маленький кружок станет красным или зеленым, верно? Или также этот значок «x» исчезнет, ​​вы пытались использовать их в качестве базы для ожидания?   -  person Spencer Melo    schedule 10.09.2019
comment
Пожалуйста, найдите минутку, чтобы исправить отступ в вашем коде. Кроме того, прочитайте, почему скриншоты кода — плохая идея. Вместо этого вставьте код и правильно отформатируйте его. Скриншот страницы в порядке, но скриншот HTML - нет. Вы понимаете, что время, которое вы ждете, составляет 28,5 лет, верно? Это кажется немного глупым, нет?   -  person JeffC    schedule 10.09.2019
comment
@Spencer, в конце сборки изменяется xpath для первого элемента, а также исчезает значок x. Я пробовал с обоими, но все еще не работает.   -  person Zoso619    schedule 11.09.2019
comment
@Джефф, я сделаю это, спасибо за предложение ????. Я знаю, что время, которое я жду, слишком велико, и это глупо, а также это тестовый код, но все же с этим временем ожидания драйвер не ждет, пока элемент исчезнет из строки состояния.   -  person Zoso619    schedule 11.09.2019


Ответы (1)


Может случиться так, что элемент не соответствует критериям, используемым этим ожидаемым условием. Ниже приведен код для InvisibilityOfElementLoc

/// <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"/> if the element is not displayed; otherwise, <see langword="false"/>.</returns>
public static Func<IWebDriver, bool> InvisibilityOfElementLocated(By locator)
{
    return (driver) =>
    {
        try
        {
            var element = driver.FindElement(locator);
            return !element.Displayed;
        }
        catch (NoSuchElementException)
        {
            // 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)
        {
            // Returns true because stale element reference implies that element
            // is no longer visible.
            return true;
        }
    };
}

Если страница не изменится, она не устареет, если поиск найдет ее, но она скрыта другим способом, когда отображение никогда не возвращает false, это никогда не сработает.

Возможно, вам придется написать собственную функцию, чтобы она работала с вашей страницей.

person J.D. Cain    schedule 11.09.2019
comment
Tanks Каин за ответ, но это встроенные функции, есть ли способ обновить их? - person Zoso619; 12.09.2019
comment
@ Zoso619 Я не уверен, что следую. InvisibilityOfElementLocated - это существующий метод, но вы можете написать свою собственную функцию для .Until, чтобы использовать ее для конкретных условий, для которых вы хотите. Также каждый раз, когда вы используете Wait.Until, вы устанавливаете максимальное время, после которого будет выдано исключение. Если индикатор выполнения занимает больше времени, чем x, то ожидание не удалось. - person J.D. Cain; 12.09.2019
comment
Пробовал это, у меня не сработало. На самом деле драйвер ждет 5-6 минут, прежде чем выдать исключение Stale Element. Не уверен, почему он не ждет, пока панель не станет невидимой в пользовательском интерфейсе. Ожидание, но не более 5-6 минут. Для тестового примера, который занимает больше времени, происходит сбой. - person Zoso619; 13.09.2019