How do I create a "getter" for my modules (How do you instantiate a Module Object using a Navigator?)
How do I create a "getter" for my modules (How do you instantiate a Module Object using a Navigator?)
我正在努力使我的所有页面和 module 引用都可以在 intellij 中自动完成。
由于某种错误,我无法像往常一样执行此操作。 (详情请见此处:How to have geb static content recognized form test script)
为了解决上述错误。我选择为所有静态内容创建 "getters"。
例如:
页面:
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()
所以上面的所有代码都按我预期的那样工作,我想像这样重做我的页面,这样我就可以从脚本端自动完成。当我尝试对 mod 规则使用相同的技术时出现问题。
例如:
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()
}
}
尝试从脚本访问 module 时出现以下错误:
geb.error.ModuleInstanceNotInitializedException: Instance of module class MyModule has not been initialized. Please pass it to Navigable.module() or Navigator.module() before using it.
我想它想让我获取一个实例化的导航器对象并调用 module(MyModule)
但我不确定它是如何工作的或者如何决定从哪个导航器对象调用 module .
总而言之,我只想能够从我的脚本中自动完成 module 名称和静态内容。
Book of Geb's section about modules 回答了您的问题。你不应该手动调用模块的构造函数,而是使用本章开头描述的语法。这个解决方案摆脱了异常,也为我解决了代码完成问题:
static content = {
mod { module MyModule }
}
现在异常已经消失,这里是如何添加您要求的 getter:
def myModule() { mod }
我认为问题是你 content
阻止了。 Module
s 是通过 Navigator
s' module
方法定义的:
static content = {
mod { $("div.module").module(MyModule)
}
因此不需要调用构造函数。
当 returning 包含来自 return 类型为 class 的方法的模块的内容时,您会得到一个 GroovyCastException
扩展 geb.Module
因为从内容定义中 return 导航器和模块被包裹在 geb.content.TemplateDerivedPageContent
.
中
您可以使用 as
关键字解包它们,如有关 unwrapping modules returned from the content
DSL 的手册部分所述。因此,对于您的一个示例,它看起来像这样:
MyModule mod(){
mod as MyModule
}
我正在努力使我的所有页面和 module 引用都可以在 intellij 中自动完成。
由于某种错误,我无法像往常一样执行此操作。 (详情请见此处:How to have geb static content recognized form test script)
为了解决上述错误。我选择为所有静态内容创建 "getters"。
例如:
页面:
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()
所以上面的所有代码都按我预期的那样工作,我想像这样重做我的页面,这样我就可以从脚本端自动完成。当我尝试对 mod 规则使用相同的技术时出现问题。
例如:
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()
}
}
尝试从脚本访问 module 时出现以下错误:
geb.error.ModuleInstanceNotInitializedException: Instance of module class MyModule has not been initialized. Please pass it to Navigable.module() or Navigator.module() before using it.
我想它想让我获取一个实例化的导航器对象并调用 module(MyModule)
但我不确定它是如何工作的或者如何决定从哪个导航器对象调用 module .
总而言之,我只想能够从我的脚本中自动完成 module 名称和静态内容。
Book of Geb's section about modules 回答了您的问题。你不应该手动调用模块的构造函数,而是使用本章开头描述的语法。这个解决方案摆脱了异常,也为我解决了代码完成问题:
static content = {
mod { module MyModule }
}
现在异常已经消失,这里是如何添加您要求的 getter:
def myModule() { mod }
我认为问题是你 content
阻止了。 Module
s 是通过 Navigator
s' module
方法定义的:
static content = {
mod { $("div.module").module(MyModule)
}
因此不需要调用构造函数。
当 returning 包含来自 return 类型为 class 的方法的模块的内容时,您会得到一个 GroovyCastException
扩展 geb.Module
因为从内容定义中 return 导航器和模块被包裹在 geb.content.TemplateDerivedPageContent
.
您可以使用 as
关键字解包它们,如有关 unwrapping modules returned from the content
DSL 的手册部分所述。因此,对于您的一个示例,它看起来像这样:
MyModule mod(){
mod as MyModule
}