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

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

xpath
csharp
locators
webdriver
selenium
Теги: #<Tag:0x00007f9c55f9d280> #<Tag:0x00007f9c55f9cdf8> #<Tag:0x00007f9c55f9ca88> #<Tag:0x00007f9c55f9c6f0> #<Tag:0x00007f9c55f9c3a8>

(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 не видно на скриншоте.


(Viktor) #40

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


(Viktor) #41

Я вам написал пример выше как сделать чтоб работало и обрабатывать любые ошибки, но на скриншоте опять вижу что все по старому, так работать стабильно не будет


(Lelik) #42

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


(Viktor) #43

if (ManufactPart.ddlMachine.Displayed)
{
ManufactPart.ddlMachine.SendKeys(machine);
}
Так лучше не делать тесты должны быть линейными

ManufactPart.ddlMachine.Displayed @Noksa прав, элемент уже найден, вы просто проверяете, элемент отображается или скрыт, но он должен существовать

самый простой и топорный способ для определения существует элемент на данный момент или нет

        public bool Exist (By locator)
        {
            try
            {

                driver.FindElement(locator);
                return true;
            }
            catch
            {
                return false;
            }
        }

Но такой метод не будет работать если есть задержка перед появлением или исчезанием, там еще нужно будет накинуть логику на ожидание


(Viktor) #44

Посмотрите в сторону этого фраемворка, по идее он решит ваши проблемы

Правда возможно тут нет поддержки протрактора, а он для Angular желателен


(Lelik) #45

Мне нужен протрактор. Вариант на что-то менять - не вариант.
Для процесса отладки чуть “улучшила” метод

Если элемент не существует, я ловлю “странный” эксепшин
“wait=error CS0103: The name ‘wait’ does not exist in the current context”
отдаю методу isdisplayed значение element =null и прекрасненько двигаюсь дальше.
В случае когда элемент существует, я получаю этот же эксепшин.

Говорят проблема в https://www.screencast.com/t/ei9jJmNoX0wY , причем я добавляла пакет и protractor core, и frwamework - ошибки одинаковые.