В Selenium Element.Displayed() слишком долго ждет, прежде чем поймать исключение

Я написал метод IsElementPresent, который возвращает true/false независимо от того, отображается элемент или нет.

Вот мой метод

    public static bool IsElementPresent(this IWebElement element)
    {
        try
        {
            return element.Displayed;                                  
        }
        catch (Exception)
        {
            return false;
        }

    }

Теперь иногда, когда он должен возвращать false, element.Displayed ожидает примерно 20 секунд (обнаружено с помощью отладки), прежде чем поймать исключение и вернуть false. Если он находит элемент, он работает нормально.

Я также изменил код на:

public static bool IsElementPresent(this IWebElement element)
{          
    try
    {
        WebDriverWait wait = new WebDriverWait(DriverContext.Driver, TimeSpan.FromSeconds(0.1));
        wait.Until(ExpectedConditions.ElementToBeClickable(element));                
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

Теперь то же ожидание происходит в строке Wait.Until. Код работает нормально, но просто нежелательные задержки, когда он не находит элемент. Имеет ли значение, как элемент найден. Эта конкретная задержка происходит, когда элемент найден по классу. Большинство других элементов можно найти с помощью xpath, css или id. Дайте мне знать, если я пропустил какую-либо информацию. Использование сообщества VS 15.5.6


person Rutwik    schedule 23.02.2018    source источник
comment
Каков ваш точный вопрос? Можете ли вы подытожить шаги, выполняемые вручную, которые вы пытаетесь автоматизировать?   -  person DebanjanB    schedule 24.02.2018
comment
Не могли бы вы опубликовать немного HTML-кода вокруг этого элемента?   -  person Rescis    schedule 24.02.2018
comment
Я пытаюсь автоматизировать приложение. Эта проблема возникает на одной из наших форм. На этой странице я выполняю какое-то действие, нажимая на кнопку. Если это действие не разрешено, веб-приложение выдаст ошибку на странице с текстом. Теперь я написал метод (этот метод вызывает вышеупомянутый метод), который будет проверять, присутствует ли этот текст ошибки (проверка выполняется только в том случае, если ошибки нет). Теперь, когда он достигает element.Displayd, он тоже ждет, прежде чем генерировать исключение. Надеюсь, я ответил на все вопросы.   -  person Rutwik    schedule 24.02.2018
comment
Вот HTML-элемент. ‹span id=C1_lblError class=lblCErr› Следующие листы имеют проблемы,‹br› Район‹br› Исправьте ошибки в файле Excel.‹/span›   -  person Rutwik    schedule 24.02.2018


Ответы (1)


Согласно IWebElement.Displayed свойству gets a value indicating whether or not this element is displayed Документов API. В этом нет необходимости ждать. Поэтому, если возникает какое-либо Exception, его мгновенное значение.

Но когда вы вызываете Wait.Until вместе с Класс ExpectedConditions, предоставляющий набор общих условий, которые можно ожидать с помощью WebDriverWait Class экземпляр WebDriver ожидает в соответствии с ExpectedConditions, которое представляет собой ExpectedConditions.ElementToBeClickable Method (By) в вашем случае .

ExpectedConditions.ElementToBeClickable Method (By) определяется как ожидание проверки того, что элемент виден и включен, чтобы его можно было щелкнуть.

  • Синтаксис:

    public static Func<IWebDriver, IWebElement> ElementToBeClickable(
        By locator
    )
    
  • Параметры:

    locator
    Type: OpenQA.Selenium.By
    The locator used to find the element.
    
  • Возвращаемое значение:

    Type: Func<IWebDriver, IWebElement>
    The IWebElement once it is located and clickable (visible and enabled).
    

Таким образом, функционально нет задержек при работе с WebDriverWait и ExpectedConditions.

Наконец, как вы упомянули, эта конкретная задержка происходит, когда элемент найден по классу. Большинство других элементов можно найти с помощью xpath, css или id , это факт, связанный с Стратегия поиска, которую вы использовали при выборе locator из списка ниже:

  • css selector
  • link text
  • partial link text
  • tag name
  • xpath

Было проведено немало экспериментов и тестов производительности локаторов. Вы можете найти некоторые обсуждения здесь:

person DebanjanB    schedule 24.02.2018