Перейти к содержимому

sospectra

Регистрация: 11 дек 2014
Offline Активность: 12 июн 2016 16:41
-----

Мои сообщения

В теме: Борьба со "StaleElementReferenceException: Element is no longer at

04 февраля 2015 - 14:10

Спасибо за тему! Мне помогли ваши советы найти решение для обхода этой проблемы. предлагаю свой вариант для тех, кто тоже с этим столкнется:

        public bool WaitForElement(Action testMethod)
        {
            try
            {
                testMethod();
            }
            catch (StaleElementReferenceException)
            {
                testMethod();
            }
            catch (ElementNotVisibleException)
            {
                return false;
            }
            catch (NoSuchElementException)
            {
                return false;
            }
            return true;
        }
webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(15));
           
var a = false;
short j = 0;
do
 {
  _Page.SelectCity.Click();
  var b = _Page.WaitForElement(() =>
    {
      _Page.SetCityToSelect("Москва");
      _Page.SelectThisCity.Click();
     });
   a = b;
   j++;
  } while (!a && j < 100);
            
webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));

Assert.IsTrue(a);

Где:

_Page.SelectCity.Click(); 

- Открытие выпадающего списка с перечнем городов.

_Page.SetCityToSelect("Москва");

- Установка атрибута на строчку списка с названием "Москва" для дальнейшего поиска по нему вот таким образом:

WebDriver.ExecuteJavaScript<string>("$('" + csspath + "').attr('autId','cityToSelect'); return '0';");
public IWebElement SelectThisCity
        {
            get
            {
                return WebDriver.FindElement(By.CssSelector("[autId='cityToSelect']"));
            }
        }

А без кастомного атрибута элемент не получается найти - особенность реализации подгружаемого списка.

 

Клик по элементу выпадающего списка:

_Page.SelectThisCity.Click();

В чем была моя проблема:

  1. Вебдрайвер кликал на выпадающий список.
  2. Пока искал город, чтобы проставить атрибут, список почему-то закрывался.
  3. Если не кликнуть на выпадающий список еще раз, то найденный элемент с проставленным атрибутом становился скрытым, и выбрать его было невозможно (ElementNotVisibleException).
  4. А если кликнуть, то список перезагружался, проставленный атрибут стирался, и элемент нельзя было найти по нему (NoSuchElementException).
  5. Увеличение ImplicitlyWait позволило вызывать StaleElementReferenceException, но успех был через раз. Кстати, на StackOverFlow советуют возвращать обратно на маленькое значение, чтобы другие тесты не стали проходить медленнее.
  6. Без повторов операции по счетчику метод не срабатывает - потому что у меня могут возникнуть все три вида исключений, а задать последовательность операций для всех случаев было сложнее, чем сделать такой цикл.

Итог: Код, которым я поделилась, работает.

 

Если есть альтернативные, более оптимальные пути решения проблемы - буду рада советам.


В теме: Автоматизация тестирования UI веб-приложения с Silverlight 5. Выбор фр

15 декабря 2014 - 20:00

Спасибо вам большое за ответ!

Раз больше нет мнений, буду изучать разбиваемость CUIT тестов

 

Работаю с Coded UI несколько лет, правда автоматизация декстопная, особых проблем не вижу

Сложности развития и поддержки невысоки, чистый c#, никаких выдуманных языков, логика легко разбиваема

Проект отдельно, конечно, можно создать

Если вам удобнее использовать для поиска контролов Xpath посмотрите в сторону http://www.ranorex.com

По поводу TDD для UI тестов, идеи как это сделать существуют, реально чтобы у кого то работало на маломальски большом проекте не видел


В теме: Автоматизация тестирования UI веб-приложения с Silverlight 5. Выбор фр

15 декабря 2014 - 19:59

Если кому вдруг будет полезна эта тема, вот информация по "Бутерброду". Может помочь с оценкой.

http://bugscatcher.net/archives/2033