t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

csharp
xpath
locators
webdriver
selenium
Теги: #<Tag:0x00007f21d6dd6180> #<Tag:0x00007f21d6dd6018> #<Tag:0x00007f21d6dd5de8> #<Tag:0x00007f21d6dd5c80> #<Tag:0x00007f21d6dd5af0>

(Viktor) #20

Так как у меня тоже можно, от перестановки мест слагаемых как говорится) И лишний поиск убирается


(Dmitrij Abashin) #21

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


(Юрий Аксютин) #22

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


(Viktor) #23

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


(Юрий Аксютин) #24

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


(Viktor) #25

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


(Lelik) #26

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


(Сергей Кузьмин) #27

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


(Viktor) #28

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


(Сергей Кузьмин) #29

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


(Viktor) #30

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


(Сергей Кузьмин) #31

судя по истории коммитов в https://github.com/angular/protractor (https://github.com/angular/protractor/blob/master/lib/clientsidescripts.js год назад последний раз) наоборот умер он похоже или к тому идет


(Viktor) #32

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


(Сергей Кузьмин) #33

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

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


(Lelik) #34

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


(Lelik) #35

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


(Alexandr D.) #36

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

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

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

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


(Lelik) #37

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


(Alexandr D.) #38

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

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


(Valentin G ) #39

Примерно так выглядит метод, где есть 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 не видно на скриншоте.