NoSuchElementException после ExplicitWait

В UI тесте реализовано явное ожидание посредством экстеншн метода, а также хелпер для ввода текста.

public static void WaitForElement(this IWebDriver driver, IWebElement el, int sec)
{
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(sec));
            wait.Until(IsDisplayedCondition(el));
}
private static Func<IWebDriver, IWebElement> IsDisplayedCondition(IWebElement el)
{
            return new Func<IWebDriver, IWebElement>(d => el.Displayed ? el : null);
}
public static void EnterText(this IWebElement element, string text)
{
            element.Clear();
            element.SendKeys(text);
}

Код теста выглядит следующим образом (PostalCodeInput инициализирован фабрикой)

driver.WaitForElement(PostalCodeInput, 5);
PostalCodeInput.EnterText("12-345");

Получаю NoSuchElementException эксепшн при попытке ввести текст в PostalCodeInput. То есть ожидание проходит, но элемента нет (визуально он есть). Это происходит не каждый раз, изредка. Как такое возможно? Почему это происходит?

Если между строками теста вставить Thread.Sleep(500), то проблема исчезает…

Selenium Webdriver 3.5.2 + Selenium.WebDriver.ChromeDriver

  • ImplicitWaits и стандартная фабрика - ужасная ошибка Selenium, о которой жалеют и сами разработчики. Что мешает использовать явные ожидания повсюду? Особенно, ввиду наличия extension методов.
  • При использовании By локаторов у ExpectedConditions есть стандартный ElementIsVisible под ваш кейс.
  • Зачем каждый раз при обращении к WaitForElement создавать новый объект WebDriverWait?
  • Вы ждете элемент, но затем выполняете целых 2 операции над ним (очистки поля и ввода текста), полагаясь на адекватность фабрики. Но как вы думаете, чисто теоретически возможна ситуация, когда очистка поля может каким-то образом повлиять на состояние элемента в DOM? :wink:
1 лайк