Здравствуйте!
Исользуется: 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...
}
Пробовал
Вообще почитал все что было дадено…
Ситуация такова что AjaxElementLocator имеет ожидание 5 сек.(default)
При этом если есть implicitlyWait а так же wait в until то там такой фарш начинается (протсите за мой французский)
Каким точно образом происходит наложение я так и не понял, но продебажил уже почти весь фреймворк…(
если есть вложенность блока в блок то функция висит невыносимо долго и чем больше вложенность тем больше висит.
Попробовал подменить AjaxElementLocatorFactory на свой, но увы ожидание осталось 5 сек.
Тогда вопрос неужели в HtmlElements нельзя один блок вложить в другой?
Если можно, то тогда вот это:
element = myPage.getMyForm().getMySubForm().getButton().getWrappedElement();
(new WebDriverWait(driver, 5)).until(ExpectedConditions.visibilityOf(element));
в случае, если element не существует, не вывалится по TimeoutException. (ну об этом я уже писал)
Можно… блоки это те-же веб элементы, с нужными тебе дополнительными методами и полями - веб элементами и блоками…
Только не нужно такие вот цепочки строить лучше из пейджи вызвать метод в форме, который внутри себя уж будет все делать
Я более чем уверена, что дело в имплиситных ожиданиях.
Дело в том, что под капотом у любого ExpectedConditionsлежит обычный findElement. Ну, по крайней мере, в большинстве случаев. Так вот, передавая период ожидания для WebDriverWait мы как бы ограничиваем количество попыток. То есть, если findElement с имплиситом занимает 5 секунд, а мы говорим, WebDriverWait 60 секунд, то фактически мы успеем 6 раз спросить findElement, прежде чем упасть по таймауту.
Если же мы говорим, что имплисит = 60 секунд, а WebDriverWait 10 секунд, мы как бы говорим, что ну спроси хотяы один раз, если нет - падай. Собственно этот один раз никак не прерывается WeDriverWait-ом, поэтому и происходит таймаут в 1 минуту.
Так что если хотите здесь падать быстро, ставьте имплисит меньше