Ожидаемые условия С# Selenium являются устаревшими

При попытке явно ожидать, когда элемент станет видимым с помощью ExpectedConditions, Visual Studio предупредит меня, что он устарел и вскоре будет удален из Selenium.

Каков текущий/новый метод для достижения того же результата?

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));

Ответ 1

Я решил свой собственный вопрос и хотел дать ответ всем, кому интересно, как решить эту проблему с помощью последней версии Selenium.

Используя nuget, выполните поиск DotNetSeleniumExtras.WaitHelpers, импортируйте это пространство имен в свой класс. Теперь вы можете сделать это:

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("content-section")));

И предупреждение в IDE исчезнет.

Ответ 2

Если вы не хотите загружать дополнительный пакет nuget, довольно легко объявить свою собственную функцию (или условие), особенно используя выражение lamda, например

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
var element = wait.Until(condition =>
{
    try
    {
        var elementToBeDisplayed = driver.FindElement(By.Id("content-section"));
        return elementToBeDisplayed.Displayed;
    }
    catch (StaleElementReferenceException)
    {
        return false;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
});

Это также очень многогранно, так как теперь можно оценить любое выражение bool.

Ответ 3

Это очень просто, просто измените

Wait.Until(ExpectedConditions.ElementIsVisible(By.Id("content-section")));

в

Wait.Until(c => c.FindElement(By.Id("content-section")));

Ответ 4

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

var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
wait.IgnoreExceptionTypes(typeof(NoSuchElementException), typeof(ElementNotVisibleException));
var element = wait.Until(() => 
{
    var e = Driver.FindElement(By.Id("content-section"));
    if(e.Displayed)
        return e;
});

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

Согласно вкладчику С#:

Что касается ожидаемых условий, опять же, это было дополнение, которое был создан в .NET исключительно потому, что "у Java есть это". В то время Создан класс ExpectedConditions в Java, синтаксис для создания лямбда-функция (или что-то, что действовало как единое целое) была особенно тайный и трудный для понимания. В этом случае вспомогательный класс сделал много смысла для привязки Java. Тем не менее, С# не Java. В С# синтаксис для создания лямбда-функций ("анонимные методы" в язык документации Microsoft) был хорошо понят С# разработчики уже много лет и являются стандартным инструментом в их арсенале.

В этом случае вопрос о многословности кода имеет свои достоинства, но поскольку условия ожидания редко бывают универсальными, было бы очень более чистый подход для пользователей, чтобы разработать свой собственный класс условий, которые имеет условия ожидания, в которых они заинтересованы. что-то, к чему у пользователей есть отвращение. Кроме того, мысль о "стандартный" набор реализаций определенных условий ожидания кажется хорошей идеей на первый взгляд, но есть много изменение способа, которым пользователи хотят, чтобы любое заданное условие работало. Иметь Коллекция условий ожидания может быть хорошей вещью, но Selenium проект не место для этого.

http://jimevansmusic.blogspot.com/2018/03/deprecating-parts-of-seleniums-net.html

Ответ 5

Требуется Nuget - DotNetSeleniumExtras.WaitHelpers

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("")));

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

Ответ 6

Основываясь на ответе @Rob F., я добавил методы расширения в свой проект. (На самом деле я добавил два, WaitUntilVisible(...) и WaitUntilClickable(...)

Они возвращают элемент, а не bool, так что больше похоже на Wait.Until(ExpectedConditions...)

// use: element = driver.WaitUntilVisible(By.XPath("//input[@value='Save']"));
public static IWebElement WaitUntilVisible(
    this IWebDriver driver,
    By itemSpecifier,
    int secondsTimeout = 10)
{
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, secondsTimeout));
    var element = wait.Until<IWebElement>(driver =>
    {
        try
        {
            var elementToBeDisplayed = driver.FindElement(itemSpecifier);
            if(elementToBeDisplayed.Displayed)
            {
                return elementToBeDisplayed;
            }
            return null;
        }
        catch (StaleElementReferenceException)
        {
            return null;
        }
        catch (NoSuchElementException)
        {
            return null;
        }

    });
    return element;
}

Ответ 7

проверьте, какая версия пакета Selenium.Support и Selenium.WebDriver NuGet вы установили. Я получил ту же проблему сейчас с последней версией 3.11.2, и я понизил ее до 3.10.0, и это устранило проблему.