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

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

csharp
xpath
locators
selenium
webdriver
Теги: #<Tag:0x00007f21d83500d8> #<Tag:0x00007f21d83f7ea0> #<Tag:0x00007f21d83f7d38> #<Tag:0x00007f21d83f7bd0> #<Tag:0x00007f21d83f7a40>

(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 - ошибки одинаковые.


(Viktor) #46

Нет проблема не в этом, там что то не так в логике метода


(Lelik) #47

Я согласна что проблема в логике метода, но в чем… Может коллективный разум мне поможет разобраться.
Сидуация такая. На странице есть несколько элементов. Один тест заполняет все элементы и все ок.
Второй тест. При определенный условия выбора одного из элементов, несколько других эелементов прячутся. Собственно это причина почему я проверяю есть ли элемент на странице и если нет - пропускаю.
Тут начинается самое интересное.
Заполняю видимые эдементы.
Проверяю есть ли элемент на странице и если есть вписываю значение

            if (AdditionalOptions.IsElementDisplayed(Driver, Part.ddlMachine))
                Part.ddlMachine.SendKeys(machine);

Собственно сам локатор

public IWebElement ddlglossfactor => PropertiesCollection.Driver.FindElementClickable(By.Id("m-p-prop-1"), 10);


Тут происходит поиск.

public static IWebElement FindElementClickable(this NgWebDriver driver, By by, int timeoutInSeconds = 30)
        {
            try
            {
                var wait = new DefaultWait<IWebDriver>(driver);
            wait.IgnoreExceptionTypes(typeof(StaleElementReferenceException), typeof(NoSuchElementException), typeof(Exception));
            wait.Timeout = TimeSpan.FromSeconds(timeoutInSeconds);
            wait.Until(d => d.FindElement(by).Displayed && d.FindElement(by).Enabled);           
            return driver.FindElement(by);
            }

            catch (Exception)
            {
                return null;
            }
        }
       public static bool IsElementDisplayed(IWebDriver driver, IWebElement element)
        {
            var present = false;
            try
            {
                present = element.Displayed;
              
            }
            catch (NoSuchElementException)
            {
                return false;
            }

            catch (NullReferanceException)
            {
                
                return false;
               
            }
            catch 
            {

                return false;

            }
  
             return present;
        }

Так вот если элемент не найден по какой-то причине - драйвер ждет 60 сек и падает по таймайту. Меня это почти устраивает, хотя таймаут задаю 30 сек, а то и меньше, но это значение игнорится.

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


(Viktor) #48

вы пробывали выключить синхронизацию в протракторе?


(Lelik) #49

Синхронизацию? В смысле wrappeddriver?


(Viktor) #50

На некоторых страницах синхронизация может не работать
делайте так:
Driver.IgnoreSynchronization = true;
но там где все ок нужно включать
Driver.IgnoreSynchronization = false;


(Lelik) #51

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


(Viktor) #52

бывает не работает, вы затестили?


(Lelik) #53

Driver.IgnoreSynchronization = false; добавила. Ничего не поменялось.


(Lelik) #54

Смотрите(чуть поменяла метод), в первом случае когда элемент есть, находит и возвращает найденный элемент https://www.screencast.com/t/oJMNcDRcL

Во втором случае, начинаю проверять наличие элемента и все.


(Lelik) #55

Проблему я решила. С методами и тестами было все ок. На самом деле, я опять портировала .netframework тысты, добавила https://www.screencast.com/t/Qx0EVE8v4y7 пару пакетов, которые нашла в рекоменлациях гугла. Что действительно решило проблему , или аккуратное портирвоание или эти пакеты для правильно локализации пейдж-объектов, я не знаю. Но склоняюсь к мысли что все же второе.