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

WebDriverWait висит аж целую минуту вместо заданных 5 сек!


(Andrey) #1

Здравствуйте!
Исользуется: Java + HtmlElements(от Yandex)
Ситуация такова: element не существует на форме, т.к. самой формы нет |=> конструкция (new WebDriverWait(driver, seconds)).until(ExpectedConditions.visibilityOf(element)); должна вывалится по TimeoutException
Но вместо этого мы висим около минуты, а то и больше
Помогите кто чем может)

Более подробно:

public class TextInputWrap extends TextInput{
	public TextInputWrap(WebElement wrappedElement) {
		super(wrappedElement);
	}

	// SMF methods...
}
public class MyForm extends HtmlElement{
	@FindBy(className = "SMF")
	public TextInputWrap inputField;
}

public class MyPage{

	WebDriver driver;
	@FindBy(className = "SMF")
	public MyForm myForm;
	
	public MainPage(WebDriver driver) {
		this.driver = driver;
		PageFactory.initElements(new HtmlElementDecorator(driver), this);
	}

	public MyForm waitAndGetMyForm(int seconds) {
		WebElement element = this.myForm.inputField.getWrappedElement(); // Специально вынес, чтобы убедится что HtmlElements не при чем это строка отработает быстро
		(new WebDriverWait(driver, seconds))
				.until(ExpectedConditions.visibilityOf(element)); // Висим ~ 50 сек, вместо положенных 5
		return campaignForm;
	}
}

@Test
public void myTest() {
	myPage.myForm.;

	MyForm myForm = myPage.waitAndGetMyForm(driver, 5);

	// SMF code...
}

(vmaximv) #2

Грабли…

http://automated-testing.info/t/yavnye-i-neyavnye-ozhidaniya-pomogite-razobratsya/


(Sergey Korol) #3

(Антон) #4

Да кстати можно еще передавать в конструктор WebDriverWait третий параметр в миллисекундах, который как раз и отвечает за частоту опроса.


(Sergey Korol) #5

#6

Не пробовали выставлять неявное ожидание в 0, предполагаю здесь:

public MyForm waitAndGetMyForm(int seconds) {
	WebElement element = this.myForm.inputField.getWrappedElement();
        driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
	new WebDriverWait(driver, seconds)
				.until(ExpectedConditions.visibilityOf(element));
	return campaignForm;
	}

(Andrey) #7

Пробовал
Вообще почитал все что было дадено…
Ситуация такова что AjaxElementLocator имеет ожидание 5 сек.(default)
При этом если есть implicitlyWait а так же wait в until то там такой фарш начинается (протсите за мой французский)
Каким точно образом происходит наложение я так и не понял, но продебажил уже почти весь фреймворк…(
если есть вложенность блока в блок то функция висит невыносимо долго и чем больше вложенность тем больше висит.
Попробовал подменить AjaxElementLocatorFactory на свой, но увы ожидание осталось 5 сек.


(Andrey) #8

Тогда вопрос неужели в HtmlElements нельзя один блок вложить в другой?
Если можно, то тогда вот это:

element = myPage.getMyForm().getMySubForm().getButton().getWrappedElement();
(new WebDriverWait(driver, 5)).until(ExpectedConditions.visibilityOf(element));

в случае, если element не существует, не вывалится по TimeoutException. (ну об этом я уже писал)


(Антон) #9

Можно… блоки это те-же веб элементы, с нужными тебе дополнительными методами и полями - веб элементами и блоками…
Только не нужно такие вот цепочки строить лучше из пейджи вызвать метод в форме, который внутри себя уж будет все делать :smile:


(Jane Tymoschuk) #10

Я более чем уверена, что дело в имплиситных ожиданиях.
Дело в том, что под капотом у любого ExpectedConditionsлежит обычный findElement. Ну, по крайней мере, в большинстве случаев. Так вот, передавая период ожидания для WebDriverWait мы как бы ограничиваем количество попыток. То есть, если findElement с имплиситом занимает 5 секунд, а мы говорим, WebDriverWait 60 секунд, то фактически мы успеем 6 раз спросить findElement, прежде чем упасть по таймауту.
Если же мы говорим, что имплисит = 60 секунд, а WebDriverWait 10 секунд, мы как бы говорим, что ну спроси хотяы один раз, если нет - падай. Собственно этот один раз никак не прерывается WeDriverWait-ом, поэтому и происходит таймаут в 1 минуту.
Так что если хотите здесь падать быстро, ставьте имплисит меньше