我正在努力做到这一点,以便所有页面和模块引用都可以在intellij中自动完成。
由于某种错误,我无法像通常那样执行此操作。 (有关更多详细信息,请参见此处:How to have geb static content recognized form test script)
为了解决上述错误。我选择为所有静态内容创建“获取器”。
例如:
页面:
class MyPage extends Page{
static content = {
tab {$(By.xpath("somexpath")}
}
Navigator tab(){
return tab
}
}
脚本:
//imagine we are in the middle of a feature method here
def test = at MyPage
test.tab().click()
因此,以上所有代码均按预期工作,并且我想像这样重做页面,以便可以从脚本端自动完成。当我尝试对模块使用相同的技术时,会出现问题。
例如:
class MyPage extends Page{
static content = {
mod {module(new MyModule())}
}
MyModule mod(){
return mod
}
}
如果我尝试从脚本中访问mod
//imagine we are in the middle of a feature method here
def test = at MyPage
test.mod().someModContentMaybe().click()
我收到以下错误:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'MyPage' -> mod: 'MyModule' with class 'geb.content.TemplateDerivedPageContent' to class 'MyModule'
如果我尝试在页面对象中执行以下操作:
class MyPage extends Page{
static content = {
mod {module(new MyModule())}
}
MyModule mod(){
return new MyModule()
}
}
尝试从脚本访问模块时出现以下错误:
geb.error.ModuleInstanceNotInitializedException: Instance of module class MyModule has not been initialized. Please pass it to Navigable.module() or Navigator.module() before using it.
我猜想它要我实例化一个Navigator Object并调用module(MyModule)
,但是我不确定它是如何工作的,或者不确定如何决定从哪个Navigator Object调用模块。
总而言之,我只想能够从脚本中自动完成模块名称和静态内容。
答案 0 :(得分:3)
Book of Geb's section about modules回答了您的问题。您不应手动调用模块的构造函数,而应使用本章开头所述的语法。此解决方案摆脱了异常,还为我解决了代码完成问题:
static content = {
mod { module MyModule }
}
现在,异常消失了,如何添加您要求的吸气剂:
def myModule() { mod }
答案 1 :(得分:2)
我认为问题是您content
封锁了。 Module
是通过Navigator
的{{1}}方法定义的:
module
因此不需要构造函数调用。
答案 2 :(得分:2)
从方法返回类型为扩展GroovyCastException
的类的方法中返回包含模块的内容时,您会得到geb.Module
,因为从内容定义返回的导航器和模块被包装在{{3 }}。
您可以使用as
关键字解开它们,如关于geb.content.TemplateDerivedPageContent
的手册部分所述。因此,对于您的一个示例,它看起来像这样:
MyModule mod(){
mod as MyModule
}