Невозможно установить текстовое поле ввода с помощью AnglurJS и Geb

Я использую Grails и AngularJS в веб-приложении. Для тестирования я пытаюсь использовать Geb (отличная оболочка для селена/веб-драйвера).

У меня возникли трудности с настройкой текстового поля ввода.

Вот мой класс страницы.

class CartReviewPage extends Page {
    static url = "albert/tony"

    static content = {
        userNameField{$("input.yy-login-input.red-login-input")}
        ...
    }

    static at = {
        userNameField != null
        ...
    }

    void enterUsername() {
        userNameField.value("[email protected]")
    }

}

Теперь, когда мой тест находится на этой странице и вызывается enterUserName(), я получаю: org.openqa.selenium.ElementNotVisibleException: элемент в настоящее время не виден, и поэтому с ним нельзя взаимодействовать

Теперь я отлаживаю код. Когда он входит в enterUserName(), переменная userNameField в отладчике Eclipse имеет вид:

userNameField - SimplePageContent (owner: CartReviewPage, args: [], value: )

Используя firebug, HTML моего текстового поля ввода:

<input id="timeout-d75b39e8-cb1d-451e-8850-4337e7fd191f-d-login-username" class="yy-login-input red-login-input" type="text" placeholder="User" autocorrect="off" autocapitalize="off">

Я начинаю думать, что Angular сделал какое-то волшебство, чтобы помешать мне обновить значение поля. Но я действительно в недоумении здесь. Любые идеи или советы?

Я использую драйвер Firefox:

def driver = new FirefoxDriver();

Я вижу открытый firefox во время запуска теста, так что там все в порядке.

Вот полная трассировка стека:

Build info: version: '2.31.0', revision: '1bd294d185a80fa4206dfeab80ba773c04ac33c0', time: '2013-02-27 13:51:26'
System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.8.3', java.version: '1.6.0_51'
Session ID: 5acf64d6-8cd6-d146-bb9f-aea1db5c9c42
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=MAC, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, rotatable=false, locationContextEnabled=true, version=23.0.1, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, browserConnectionEnabled=true, nativeEvents=false, webStorageEnabled=true, applicationCacheEnabled=true, takesScreenshot=true}]
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:187)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)
    at org.openqa.selenium.remote.RemoteWebElement.clear(RemoteWebElement.java:113)
    at geb.navigator.NonEmptyNavigator.setInputValue(NonEmptyNavigator.groovy:562)
    at geb.navigator.NonEmptyNavigator.setInputValues_closure34(NonEmptyNavigator.groovy:540)
    at geb.navigator.NonEmptyNavigator.setInputValues(NonEmptyNavigator.groovy:539)
    at geb.navigator.NonEmptyNavigator.value(NonEmptyNavigator.groovy:328)
    at geb.content.NavigableSupport.methodMissing(NavigableSupport.groovy:123)
    at com.me.CartReviewPage.enterUsername(CartReviewPage.groovy:23)
    at com.me.geb.spec.ViewProductGebSpec.viewing a product(ViewProductGebSpec.groovy:26)

Спасибо!


person More Than Five    schedule 15.09.2013    source источник


Ответы (2)


Извините, это будет не очень полезно, но это лучшее, что я могу сделать, потому что я не знаком с geb.

Кстати, я использую Protractor (https://github.com/angular/protractor) чтобы протестировать мое приложение Angular/Grails - это оболочка JavaScript для WebdriverJS/Selenium, все работает хорошо.

Protractor поддерживает Angular, что во многих отношениях упрощает жизнь. Например, вы можете найти входные данные по модели, к которой они привязаны, а не по имени — очень удобно, поскольку изменение имени элемента управления не нарушит тест!

Во всяком случае, чтобы попытаться помочь с вашим вопросом....

Контроль действительно виден? Вы можете сначала проверить видимость, чтобы увидеть, действительно ли она видна.

Завершил ли Angular компиляцию и обработку страницы? В противном случае элемент управления может отсутствовать во время выполнения вызова.

person dale.lotts    schedule 15.09.2013

Ну, я предполагаю, но похоже, что вы используете проверку userNameField != null при поступлении на страницу, но это не означает, что элемент отображается, поэтому мое предположение говорит, что geb утверждает, что он находится на странице и пытается взаимодействовать с вашим элементом, хотя на самом деле его еще нет видимый. Либо попробуйте:

static at = {
    userNameField != null
    userNameField.displayed
    ...
}

или даже:

void enterUsername() {
    waitFor {
        userNameField.displayed
    }
    userNameField.value("[email protected]")
}
person Aivaras    schedule 30.09.2013