Добрый день коллеги, после первых успешно описанных страниц с помощью HTML Elements, столкнулся с другими проблемами.
Ожидания, раньше они вызывались прямо по ходе теста в классическом виде
new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable((By.id(“accept-rules”))));
Однако сейчас, они стали валиться с Null Pointer.
Возникла так же и другая проблема, на странице появились два Select (описаны и задекорированы через ru.yandex.qatools.htmlelements.element.Select)
Собственно, при выборе какого то пункта в первом Select - некоторое время происходит, подгрузка даннных во второй, элемент при этому остается кликабельными и видимым, как можно корректно дождаться подгрузки данных?
Поясню суть проблемы. Описал примерно форму, которая есть на нескольких экранах для разных ролей пользователей.
public class Planner extends HtmlElement {
@FindBy(id = “Going_To”)
public Select destination;
@FindBy(id = “Island”)
public Select subRegion;
public void fillForm(String dest, String sub, ) {
destination.selectByVisibleText(dest);
subRegion.selectByVisibleText(sub);
Потом вызываю этот метод в классе страницы
public class TaHomePage {
private WebDriver driver;
@FindBy(id = "vacation-planner-ta")
private MainVacationPlanner mainVacationPlanner;
public HomePage(WebDriver driver) {
PageFactory.initElements(new HtmlElementDecorator(driver), this);
this.driver = driver;
}
public void mimimalFillForm(String dest, String sub, ) {
this.mainVacationPlanner.fillForm(dest, sub);
}
}
и в тесте
public void id01testCase1Hold(String destination, String subRegion) {
Проблема в том, что данные в Select subRegion подгружаются, через некоторое время после выбора destination.selectByVisibleText(dest);
Если вызывать wait в классе формы - то летит Null Pointer, driver = null, а нарушать структуру и выделять выбор селектов как два отдельных метода, что бы вызывать wait в классе страница - не хочется. Может кто нибудь поделится своими соображениями на этот счет.
Ага спасибо попробую. Просмотрел матчеры - не увидел, если что то навроде подождать пока в Selecte (ru.yandex.qatools.htmlelements.element.Select;) появится option с каким то value
Подсвечивает - это компилятор ругается?
Обычно это сопровождается каким-то сообщением. Хотелось бы увидеть его.
На вскидку могу предположить, что у Вас несколько импортов метода assertThat.
Или же, если ассерты внутри класса наследника HtmlElement, то метод isEnabled() берется именно из него, а не из WrapsElementMatchers или WebElementMatchers. Тогда нужно явно указать откуда брать метод isEnabled()
Listening on port 36107
org.openqa.selenium.NoSuchElementException: Timed out after 5 seconds. Unable to locate the element
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.43.0', revision: 'accb3003b9fb8f7cae30f9669b4c594a065396a6', time: '2014-09-09 22:22:51'
System info: host: 'ASHIPOVALOV', ip: '172.31.42.69', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_31'
Driver info: driver.version: unknown
at ru.yandex.qatools.htmlelements.pagefactory.AjaxElementLocator.findElement(AjaxElementLocator.java:73)
at ru.yandex.qatools.htmlelements.loader.decorator.proxyhandlers.WebElementNamedProxyHandler.invoke(WebElementNamedProxyHandler.java:29)
at com.sun.proxy.$Proxy12.isEnabled(Unknown Source)
at ru.yandex.qatools.htmlelements.matchers.common.IsElementEnabledMatcher.matchesSafely(IsElementEnabledMatcher.java:18)
at ru.yandex.qatools.htmlelements.matchers.common.IsElementEnabledMatcher.matchesSafely(IsElementEnabledMatcher.java:15)
at org.hamcrest.TypeSafeMatcher.matches(TypeSafeMatcher.java:65)
at ru.yandex.qatools.htmlelements.matchers.common.WrapsElementMatcher.matchesSafely(WrapsElementMatcher.java:25)
at ru.yandex.qatools.htmlelements.matchers.common.WrapsElementMatcher.matchesSafely(WrapsElementMatcher.java:16)
at org.hamcrest.TypeSafeMatcher.matches(TypeSafeMatcher.java:65)
at ru.yandex.qatools.htmlelements.matchers.decorators.WaiterMatcherDecorator.matchesSafely(WaiterMatcherDecorator.java:26)
at org.hamcrest.TypeSafeMatcher.matches(TypeSafeMatcher.java:65)
at ru.yandex.qatools.htmlelements.matchers.decorators.MatcherDecoratorsBuilder.matchesSafely(MatcherDecoratorsBuilder.java:30)
at org.hamcrest.TypeSafeMatcher.matches(TypeSafeMatcher.java:65)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:12)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
То есть получается ассерты не отрабатывают - потому, что они относятся к элементу другой страницы? Но как тогда можно подождать точной и полной загрузки другой страницы.
Тогда не до конца ясно, как реализовать ожидания используя HTML Elements. Да и вообще разве использование WebElemenet в тестах, не противоречит принципам PageObject?