3

我在 web 应用程序中使用 Grails 和 AngularJS。为了测试,我正在尝试使用 Geb(一个围绕 selenium / webdriver 的 groovy 包装器)。

我很难设置输入文本字段。

这是我的页面类。

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("me@mail.com")
    }

}

现在,当我在此页面上进行测试并调用 enterUserName() 时,我得到:org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与之交互

现在,我调试代码。进入Eclipse 调试器中enterUserName()userNameField变量为:

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)

谢谢!

4

2 回答 2

2

抱歉,这不会有太大帮助,但这是我能做的最好的,因为我不熟悉 geb。

附带说明一下,我正在使用 Protractor ( https://github.com/angular/protractor ) 来测试我的 Angular/Grails 应用程序 - 它是 WebdriverJS / Selenium 的 JavaScript 包装器,一切运行良好。

Protractor 具有 Angular 意识,在许多方面让生活更轻松。例如,您可以通过它们绑定的模型而不是名称来查找输入 - 非常好,因为更改控件名称不会破坏测试!

无论如何,试图帮助你的问题....

控件真的可见吗?您可以先检查可见性,看看它是否真的可见。

Angular 是否完成了页面的编译和消化?如果不是,则在执行调用时控件可能不存在。

于 2013-09-15T21:12:25.297 回答
2

好吧,我在猜测,但是您似乎userNameField != null在到达页面时使用了检查,但这并不意味着该元素已显示,因此我的假设是 geb 断言它在页面上并尝试与您的元素进行交互,而实际上它还不可见. 要么尝试:

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

甚至:

void enterUsername() {
    waitFor {
        userNameField.displayed
    }
    userNameField.value("me@mail.com")
}
于 2013-09-30T07:34:48.563 回答