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

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


(Alsu Vadimovna) #1

Привет!
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.
В чем может быть проблема?


Как правильно реализовать если есть на странице кнопка то клик , а если нет идем дальше!
(vmaximv) #2

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


(Alsu Vadimovna) #3
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);
	}

(vmaximv) #4

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


(Alsu Vadimovna) #5

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


(vmaximv) #6

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


(Alsu Vadimovna) #7

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


(Andrey Kim) #8

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


(vmaximv) #9

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


(Alsu Vadimovna) #10

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


(vmaximv) #11

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


(Alsu Vadimovna) #12

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


#13

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

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

(Alsu Vadimovna) #14

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