Долгое выполнение метода IsElementPresent, C# + chromedriver

Привет!
C# + chromedriver
В программировании не сильна, потому подскажите, пожалуйста. Есть такой метод:

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

Выполнение этого метода происходит долго, даже если ставлю таймаут в секундах равным 0.
В чем может быть проблема?

Покажите что есть FindElement(@by, timeoutInSeconds);.
А вообще это скорее всего ImplicitlyWait отрабатывает.

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);
	}

Тогда ImplicitlyWait - на любой FindElement(By), даже если вы поставите timeoutInSeconds=0, он будет отрабатывать.

Что делать?
когда я использую FindElement(@by, timeoutInSeconds);, то все ок, выполняется быстро. А вот в методе IsElementPresent секунд 5-10. Это как-то много

Такого быть не может - давайте логи с прувами.

Может подскажете как логи вытащить? не сталкивалась еще с этим
И еще. экспериментальным путем выяснила, что долго выполняется тогда, когда элемента на странице нет.
Сделала новый метод, без таймаута, все равно примерно 10 секунд…:frowning:

Погугли Expected Conditions webdriver. Для питона и явы это точно есть, для C# наверное тоже должно быть. Это встроенные ожидания для определенных поведений элементов на странице. Работает очень хорошо.

Так а что вас смущает? Что у вас ImplicitlyWait в 10 секунд сетнут?

я в одном тесте до 10 раз могу использовать этот метод, не терять же 100 секунд

Ну так и сделайте, что б не терять - сетайте ImplicitlyWait в ноль в своих вейтах/верифаях, а потом приводите к исходному значению. Хотя это не имеет логического обоснования - если у вас ImplicitlyWait = 10 сек, то вы готовы жертвовать этим временем, что бы дождаться появления элемента.

1 лайк

для C# есть, но очень мало и для меня они не подходят.

Если не изменят память, то с этим справвится ExpectedConditions. Вот и пример

new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)).Until(ExpectedConditions.ElementExists((By.Id(login))));

поняла. поменяла, спасибо)