Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

NoSuchElementException после ExplicitWait

java
webdriver
Теги: #<Tag:0x00007fedbac6eee0> #<Tag:0x00007fedbac6ed50>

(Igor Dulsky) #1

В 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


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