我在webapp中使用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:元素当前不可见,因此可能无法与
进行交互现在,我调试代码。当它进入enterUserName()
时,Eclipse调试器中的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)
谢谢!
答案 0 :(得分:2)
抱歉,这不会有帮助,但这是我能做的最好的事情,因为我不熟悉geb。
另一方面,我正在使用Protractor(https://github.com/angular/protractor)来测试我的Angular / Grails应用程序 - 它是WebdriverJS / Selenium的JavaScript包装器,一切运行良好。
量角器具有Angular意识,在许多方面使生活更轻松。例如,您可以通过它们绑定的模型而不是名称来查找输入 - 非常好,因为更改控件名称不会破坏测试!
无论如何,试着帮助解决你的问题......
控件真的可见吗?您可以先查看可见性,看看它是否真的可见。
Angular是否已完成编辑和摘要页面?如果不是,则在执行呼叫时控制可能不在那里。
答案 1 :(得分:2)
嗯,我在猜测,但似乎你在到达页面时使用userNameField != null
检查,但这并不意味着显示该元素,所以我的假设是geb断言它在页面上并试图与你交互元素,虽然它真的不可见。
试试:
static at = {
userNameField != null
userNameField.displayed
...
}
甚至:
void enterUsername() {
waitFor {
userNameField.displayed
}
userNameField.value("me@mail.com")
}