C# проблема с поиском элемента и ожиданием

Да, Until возвращает IWebElement, не просто ждёт.

1 лайк

ваш екстеншн FindElementExt написан хорошо, только ждет всего 5 секунд))
если вы весь try catch обернете в цикл и логику из catch перенесете в условие цикла, может заработать))
Кстати, можете ловить любой ексепшн и логировать его - для отладки

Только этот велосипед уже давно написан внутри Until)

Сори, был неправ, использую кастомную обертку над селениумом, начал немного забывать))
Но условие if (++attempt == 7) - не имеет смысла, так как ++attempt всегда равно 1

Да, не имеет, я поэтому и написал сразу готовый пример, чтоб не мучалась

Спасибо большое всем за помошь, спасибо что вы есть :slight_smile: Сорри. что сразу не ответила, ушла с головой в фиксы. Благодаря переходу на protractor + несколько улучшений в ожиданиях, тесты ускорили почти в 2 раза. Учитывая что некоторые их них были почти по 45 минут, а сейчас 20 - это существенная победа.

@lelik инткресно расскажите что такое protractor умее что selenium неумее

Ждет пока Angular “успокоится”, это и есть селениум, просто обертка на драйвер

и с A6 тоже или только с AngularJS?

Если сайт на последних версиях по идее должен работать, можете сами попробовать затестить, я выше простенький пример кидал, просто урлу свою вставьте и локаторы

судя по истории коммитов в GitHub - angular/protractor: E2E test framework for Angular apps (protractor/clientsidescripts.js at master · angular/protractor · GitHub год назад последний раз) наоборот умер он похоже или к тому идет

Пока есть Angular, будет и Protractor. Это специально они запилили. Вы же сами выше на Protractor ссылались

я им занимался оч двано даже порт на жава сделал не такой поп как у пола х но тоже супер хороший… потом что то стали появляться новости что (он тогда был 2 потом 4 и 6 ) йок

проверять времени не было

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

У меня еще одна не большая проблема. Если элемент не существует, происходит попытка его найти и тест падает. Но элемента в данном случае нет закономерно, т.е. он существуент в одних тестовых случаях и не существует в других.
Я делаю так, но этот дисплей игнорится и падает при поиске
if (ManufactPart.ddlMachine.Displayed)
{
ManufactPart.ddlMachine.SendKeys(machine);
}

Ну это же просто основы Selenium…
Неужели народ настолько обленился, что элементарную вещь не в состоянии загуглить?
Честное слово, это просто сюр какой-то!

Да тут даже простой логикой можно вывести проблему…
Displayed вызывается у экземпляра класса, а для того чтобы этот экземпляр был - его надо создать.
А для создания надо найти элемент. Выходит. он не найден ~_~

В чем ваша проблема-то? Естественно тест упадет, если элемент не найден через метод FindElement()

Для того, чтобы он не падал, надо при исключении NoSuchElementFoundException возвращать какой-то результат, а не прокидывать исключение.

Вот как вам лень дочитать до конца и псмотреть скрин, так и мне гуглить :slight_smile:
у меня есть catch для эксепшинов и нет ошибки NoSuchElementFoundException .Падает не пойму почему. Перевела тесты на netcore2.2 и все развалилось

Ну если вам лень гуглить свои ошибки или хотя бы приводить стек ошибки - то сами и решайте её.

И да, исходя из кода приведенного выше в теме, у вас нет catch в том месте, где оно может возникнуть.

Примерно так выглядит метод, где есть Try-Catch :slight_smile: :

public static void WaitForElementPresent(this IWebElement element, Driver driver, int time = 0)
        {
            Thread.Sleep(TimeSpan.FromSeconds(time));
            var wait = driver.GetNewWebDriverWait();

            try
            {
                wait.Until(dr => element.Displayed);
            }
            catch (WebDriverTimeoutException wte)
            {
                Logger.Info($"Timeout during wait. Exception: {wte.Message}");
            }
        }

У вас второй части, где ловится Exception не видно на скриншоте.

Уберите ваши трай кетчи из поиска) Вся логика уже есть внутри Wait
просто добавьте исключение которое хотите игнорить в список
wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException), typeof(NoSuchElementException), typeof(NoSuchElementFoundException ));