Ожидает HtmlElements

Если кнопки не существует, тест будет зависать гораздо дольше, чем 5 секунд.

Метод findElement() в DefaultElementLocator был вызван ~63 раза!

Чем глубже вложенность блоков, тем дольше время ожидания.

Можно ли использовать блоки таким образом в htmlElements? Что я делаю не так?

@Test
public void myTestFunc() {
    WebElement element = myPage.getMyForm()
                              .getSubForm()
                              .getButton()
                              .getWrappedElement();
    try {
        (new WebDriverWait(driver, 5))
            .until(ExpectedConditions.visibilityOf(element));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
public class MyPage {
    @FindBy(className = "...")
    private MyForm myForm;

    public MyPage(WebDriver driver){
        PageFactory.initElements(new HtmlElementDecorator(driver), this);
    }

    public MyForm getMyForm() {
        return myForm;
    }
}
public class MyForm extends HtmlElement {
    @FindBy(className = "...")
    private MySubForm mySubForm;

    public MySubForm getMySubForm() {
        return mySubForm;
    }
}
public class MySubForm extends HtmlElement {
    @FindBy(className = "...")
    private MyButtonWrap button;

    public MyButtonWrap getButton() {
        return button;
    }
}
public class MyButtonWrap extends Button {
    public MyButtonWrap(WebElement wrappedElement) {
        super(wrappedElement);
    }
    // ...
}

person Ochotnikov Andrey    schedule 02.12.2015    source источник
comment
я не вижу использования 60 нигде в вашем коде...   -  person Philipp Sander    schedule 02.12.2015
comment
Это странно... Хорошо. Я запустил еще раз и получил 25 сек. Но это слишком много, потому что WebDriverWait должен был бы бросить TimeoutExeption. (кнопки не существует) Я знаю, что в HtmlElements AjaxElementlocator время ожидания по умолчанию 5 сек., но функция висит 25 сек. И чем глубже вложенность блока, тем дольше время ожидания(   -  person Ochotnikov Andrey    schedule 03.12.2015
comment
какова цель использования WebDriverWait в вашем коде?   -  person artkoshelev    schedule 03.12.2015
comment
Суть: дождаться появления элемента. Я показал для примера. На самом деле wedriverwait находится в классе методов MyPage. Он нужен для появления формы на странице. Я хочу, чтобы последний пользователь в тесте не думал о том, как дождаться этого появления, а просто указывал время в секундах. Не могли бы вы посоветовать мне какие-либо лучшие практики?   -  person Ochotnikov Andrey    schedule 04.12.2015
comment
Помог ли мой ответ?   -  person Graham Russell    schedule 10.12.2017


Ответы (1)


Я думаю, что проблема связана с неявным ожиданием, которое по умолчанию установлено на 5 секунд. Дополнительные сведения см. в этой проблеме.

Я думаю, что происходит то, что когда вы пытаетесь получить завернутый элемент:

myPage.getMyForm().getSubForm().getButton().getWrappedElement();

он неявно ожидает 5 секунд для каждого @FindBy.

Попробуйте поставить операторы печати и посмотреть, на что тратится время, например:

public void myTestFunc() {
    System.out.println("start");
    element = myPage.getMyForm().getSubForm().getButton().getWrappedElement();
    System.out.println("got element");
    try {
        (new WebDriverWait(driver, 5)).until(visibilityOf(element));
        System.out.println("Finished waiting successfully");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
person Graham Russell    schedule 06.06.2016