Я хочу убедиться, что элемент присутствует, прежде чем веб-драйвер начнет делать вещи.
Я пытаюсь заставить что-то вроде этого работать:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Я в основном изо всех сил, как настроить любую функцию ..
TimeSpan.FromSeconds(5)
. Это делает это более ясным IMOОтветы:
В качестве альтернативы вы можете использовать неявное ожидание:
источник
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Использование решения, предоставленного Майком Кваном, может повлиять на общую производительность тестирования, поскольку неявное ожидание будет использоваться во всех вызовах FindElement. Много раз вы захотите, чтобы FindElement сразу завершился сбоем, когда элемент отсутствует (вы проверяете неправильно сформированную страницу, отсутствующие элементы и т. Д.). При неявном ожидании эти операции будут ожидать истечения всего времени ожидания, прежде чем выдать исключение. Неявное ожидание по умолчанию установлено на 0 секунд.
Я написал небольшой метод расширения для IWebDriver, который добавляет в
FindElement()
метод параметр времени ожидания (в секундах) . Это довольно очевидно:Я не кэшировал объект WebDriverWait, поскольку его создание очень дешево, это расширение может использоваться одновременно для разных объектов WebDriver, и я выполняю оптимизацию только в случае крайней необходимости.
Использование просто:
источник
WebDriverWait
изOpenQA.Selenium.Support.UI
пространства имен и поставляется в отдельном пакете, называемомSelenium WebDriver Support Classes
NuGetSelenium WebDriver Support Classes
теперь появился на NuGet как «Selenium.Support» , текущая версия 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
и теперь она прекрасно работает. На голову, если кто-то еще получит случайные элементы, которые еще не найдены.Вы также можете использовать
ExpectedConditions.ElementExists
Таким образом, вы будете искать доступность элемента, как это
Источник
источник
DotNetSeleniumExtras.WaitHelpers
(упомянутое @Dejan выше) «не поддерживается, проблемы не будут исправлены, PR не будут приняты». (источник: github.com/SeleniumHQ/selenium/issues/… ). Его издатель ищет сопровождающего, чтобы отобрать его у него.Вот вариант решения @ Loudenvier, который также работает для получения нескольких элементов:
источник
Вдохновленный решением Loudenvier, вот метод расширения, который работает для всех объектов ISearchContext, а не только для IWebDriver, который является специализацией первого. Этот метод также поддерживает ожидание, пока элемент не отобразится.
Пример использования:
источник
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
этому, все равно будет превышать значение тайм-аута, установленное здесь.Stopwatch
вокруг вызова в метод расширения иConsole.WriteLine()
внутри лямбда отправленоUntil()
. Секундомер измерял почти ровно 60 секунд, и только одно сообщение было записаноConsole
. Я что-то здесь упускаю?Я перепутал любую функцию с предикатом. Вот маленький вспомогательный метод:
источник
Вы можете узнать что-то подобное в C #.
Это то, что я использовал в JUnit - Selenium
Делать импорт связанных пакетов
источник
источник
источник
Команда clickAndWait не преобразуется при выборе формата Webdriver в Selenium IDE. Вот обходной путь. Добавьте строку ожидания ниже. Реально, проблема была в щелчке или событии, которое произошло до этой строки 1 в моем коде C #. Но на самом деле, просто убедитесь, что у вас есть WaitForElement перед любым действием, когда вы ссылаетесь на объект «By».
HTML код:
C # / NUnit код:
источник
Python:
из ЕС вы можете выбрать и другие условия, попробуйте это: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
источник
Попробуйте этот код:
источник
Явное ожидание
Пример:
источник
Использовал Rn222 и Aknuds1 для использования ISearchContext, который возвращает либо один элемент, либо список. И минимальное количество элементов может быть указано:
Пример использования:
источник
Вы не хотите ждать слишком долго, прежде чем элемент изменится. В этом коде веб-драйвер ждет до 2 секунд, прежде чем продолжить.
источник
Поскольку я разделяю определения элементов страницы и сценарии тестирования страницы, используя уже найденный IWebElement для наглядности, это можно сделать так:
источник
Это повторно используемая функция для ожидания присутствия элемента в DOM с использованием явного ожидания.
источник
Мы можем достичь этого следующим образом:
источник
WebDriverWait
не вступит в силу.Это сразу вызовет исключение, как только страница станет «интерактивной». Я не знаю почему, но тайм-аут действует так, как будто его не существует.
Возможно,
SeleniumExtras.WaitHelpers
работает, но я не пробовал. Это официально, но было разделено на другой пакет nuget. Вы можете обратиться к C # Selenium «Ожидаемые условия устарели» .Сам пользуюсь
FindElements
и проверьCount == 0
, если правда, пользуюсьawait Task.Delay
. Это действительно не совсем эффективно.источник
Вы можете использовать следующее
источник
Я вижу несколько уже опубликованных решений, которые прекрасно работают! Однако на случай, если кому-то понадобится что-то еще, я решил опубликовать два решения, которые я лично использовал в селене C #, чтобы проверить, присутствует ли элемент! Надеюсь, это поможет, ура!
Вот второй
источник
источник
Первый ответ хороший, моя проблема заключалась в том, что необработанные исключения не закрывали веб-драйвер должным образом, и он сохранял то же первое значение, которое я использовал, которое составляло 1 секунду.
Если вы получаете ту же проблему
restart you visual studio
и убедитесь, чтоall the exceptions are handled
правильно.источник
Искал, как ждать в Selenium для состояния, приземлился в этой теме, и вот что я использую сейчас:
ReadCell(row, col) != ""
может быть любое условие. Вот так, потому что:источник