Спасибо за тему! Мне помогли ваши советы найти решение для обхода этой проблемы. предлагаю свой вариант для тех, кто тоже с этим столкнется:
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();
В чем была моя проблема:
- Вебдрайвер кликал на выпадающий список.
- Пока искал город, чтобы проставить атрибут, список почему-то закрывался.
- Если не кликнуть на выпадающий список еще раз, то найденный элемент с проставленным атрибутом становился скрытым, и выбрать его было невозможно (ElementNotVisibleException).
- А если кликнуть, то список перезагружался, проставленный атрибут стирался, и элемент нельзя было найти по нему (NoSuchElementException).
- Увеличение ImplicitlyWait позволило вызывать StaleElementReferenceException, но успех был через раз. Кстати, на StackOverFlow советуют возвращать обратно на маленькое значение, чтобы другие тесты не стали проходить медленнее.
- Без повторов операции по счетчику метод не срабатывает - потому что у меня могут возникнуть все три вида исключений, а задать последовательность операций для всех случаев было сложнее, чем сделать такой цикл.
Итог: Код, которым я поделилась, работает.
Если есть альтернативные, более оптимальные пути решения проблемы - буду рада советам.