Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не срабатывает эмплицитное ожидание WebDriver + С#


(Serhii) #1

Написал вот такой метод Wait для ожидания елемента

public static bool Wait(this IWebDriver driver, By by, int timeout = 60)
        {
            
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
            wait.IgnoreExceptionTypes(typeof (NoSuchElementException));
            return wait.Until(dr => dr.ElementIsPresent(by));
            
        }

public static bool ElementIsPresent(this IWebDriver driver, By by)
        {
            try
            {
                return driver.FindElement(by).Displayed;
            }
            catch (NoSuchElementException)
            {
                return false;
            }
        }

вызываю его для несуществующего элемента на странице и почему-то сразу валюсь с ошибкой
_driver.Wait(By.Id(“some element”));

element: 'By.Id: some element' ---> OpenQA.Selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"some element"}

В чем может быть проблема?


(Alsu Vadimovna) #2
driver.FindElement(by).Displayed

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

ExpectedConditions.ElementIsVisible

Вот такими методами пользуюсь я:

public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds) {
		if (timeoutInSeconds > 0) {
			var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
			return wait.Until(drv => drv.FindElement(@by));
		}
		return driver.FindElement(@by);
	}

public static bool IsElementPresent(this IWebDriver driver, By by, int timeoutInSeconds) {
		try {
			driver.FindElement(@by, timeoutInSeconds);
		}
		catch (Exception) {
			return false;
		}
		
		return true;
	}